8
$\begingroup$

I am looking to get into a software engineer role and I need some fundamental knowledge of Computer Science Engineering concepts. Will David Milan's basic Computer Science course from Harvard, CS50x, be enough to accomplish this?

$\endgroup$
5
  • 7
    $\begingroup$ Most people will not know what CS50x is, so the question makes no sense, $\endgroup$ Feb 18, 2020 at 18:12
  • 1
    $\begingroup$ @BrianTompsett-汤莱恩 CS50(x) is quite a phenomenon in in the US, and CS50x even outside of that. At least, among developers. A bit of explanation towards a potential employer is warranted. $\endgroup$
    – Mast
    Feb 19, 2020 at 9:33
  • 1
    $\begingroup$ @Brian Tomopsett While it is a phenomenon among mostly UG students in developing countries,my question was more about the content of the course and not the recognition of the course itself. $\endgroup$
    – S.D
    Feb 19, 2020 at 13:05
  • 14
    $\begingroup$ Just curious, what do you think CS students do for the rest of 4 years outside of that one course? $\endgroup$ Feb 19, 2020 at 20:21
  • $\begingroup$ @user3067860 Whole course might have many different aspects like discreet maths,probablity,electives and other sub topics within CS.I am not sure, obviously I don't expect one single course to cover all domains. $\endgroup$
    – S.D
    Feb 21, 2020 at 6:08

5 Answers 5

14
$\begingroup$

No, not by a long shot, although Harvard's CS50x is an excellent introduction which provides around 10 hours of lectures then problem sets which support approximately 100 hours of practice at programming by solving Computer Science problems (not quite the same as software engineering problems).

Most typical entry-level software engineers (regardless of their background) will likely have spent several thousand hours learning their craft by the time they start their first job (Something roughly equivalent to the amount of time a typical graduate may have had after 3 years at university).

This obviously includes programming and core computer science concepts, but most importantly it involves having hands-on exposure to building some working software (Which is about far more than just writing code -- actually, writing code is only a small part of the total amount of work which goes into building working software).

While it's certainly true that Software Engineering is rooted in Computer Science, and computational thinking skills are an essential prerequisite, that capability is nowhere near enough on its own.

Generally speaking, most software engineering problems also have a degree of subjectivity built on top of that - i.e. they go beyond just needing to find solutions based on logic; most of the problems faced by software engineers are more about humanity - meaning that the vast majority of issues involved in building software can't be solved just by writing an algorithm.

Just to provide a few examples - this list is neither complete nor comprehensive, but hopefully illustrates the kinds of things that are learned through hands-on experience of working on software projects (even spare-time hobby projects and open-source software):

  • Requirements gathering and analysis
  • Software design principles and approaches to software design (e.g. consideration towards interfaces, modularity, and automated testing)
  • Pragmatism and consideration towards real-world constraints (e.g. people's time, or their willingness to accept change, etc.)
  • Communication, knowledge-sharing and collaboration with other developers (e.g. peer reviews, pairing)
  • UI/UX Design
  • Communication with users and stakeholders, including managing their expectations and seeking their feedback.
  • Teamwork and being able to function within processes and procedures that allow many people to contribute to the same project/codebase.

On top of that, there's also the fact that software engineering often tends not to be about using code to solve every problem but to include a lot of effort reusing other people's existing/working/tested solutions to avoid re-inventing the wheel (For example, "devops" tools, app frameworks, cloud services, 3rd-party libraries, O/S capabilities etc.)

This often includes trying out tools/libraries/frameworks to check their capabilities, then figuring out how to integrate your code with those things (e.g. through programmatic APIs, configuration management, build/integration/deployment processes, automation/scripting, etc.)

This is not to say you need to be any kind of expert in these things for an entry-level Software Engineering position, however once you're confident in the core skills of computer science, programming and computational thinking, it'll be important to focus learning around building software - at which point a lot of issues around tools/APIs/libraries/frameworks start to crop up, and so should the issues around understanding software design, testing, pragmatism, and (ideally) a lot of interaction with other programmers.

$\endgroup$
11
  • $\begingroup$ Informative.My current situation is am a grad in the field of electronics and Instrumentation and I do know the very basics of C/C++(and little python) as they are used to code some in electronics application too,but I really want to get into a software industry now and most of them currently require some hands on experience in Java and they seek someone who has built or worked on some software or framework,so can you please give me a roadmap on how to actually get into these?(currently am focusing on Java as the jobs am interested in work on it).I am really confused where to start with it. $\endgroup$
    – S.D
    Feb 19, 2020 at 13:23
  • $\begingroup$ @sagnikdas too broad. do your intro to java courses, find some tutorials using the frameworks the jobs you are interested use (spring etc) and then try make some of your own projects from scratch solving some made up problem you design. play with a couple of databases and learn the basics. once everything is running locally, then maybe start to look how code is deployed in production. enjoy the process, it takes time. $\endgroup$
    – chris
    Feb 19, 2020 at 14:00
  • $\begingroup$ Am not sure about the framework but they do mostly some backend/server side stuff along with some little front end dev. $\endgroup$
    – S.D
    Feb 19, 2020 at 14:33
  • $\begingroup$ @sagnikdas As the other comment mentions, that is far a very broad question, but you can get other university-level courses from EdX and Coursera which will introduce a lot of those topics. For example, MIT has two free Software Engineering Java courses on EdX. Also there are half a dozen free Java courses from Duke university and UC San Diego on Coursera. Beyond that, personal projects are really the way to go - once you start tackling larger and more complex projects, I expect you'll naturally run into a lot of issues around software design, frameworks, tooling, etc. $\endgroup$ Feb 19, 2020 at 17:54
  • $\begingroup$ I've worked with several software people that had an Electrical Engineering degree, and they didn't use Java. Decide what your end goal is, and take your choice of primary language seriously because the right combo can mean an extra digit on your paycheck. @sagnikdas $\endgroup$
    – JPhi1618
    Feb 20, 2020 at 16:42
8
$\begingroup$

The purpose of an introductory course is threefold:

  1. To lay out the field, and give the student a sense of what that field involves and entails.
  2. To provide the fundamental background knowledge one would need to proceed further into the field.
  3. To help students figure out whether this is a field they should pursue further.

I have only a passing familiarity with the CS50x courses, so someone with more intimate knowledge me jump into correct me, but my impression is that these courses focus mostly on goal number two. Goal number 1 is laudatory, but the truth is that the field is so broad, it would be impossible to do justice to even a small subset of the fields of knowledge within computer science and computer engineering in an introductory course.

That's not to say that it would be a bad idea to go through this course if you're looking to change fields. There's a reason that this material has been created as an introduction. This is fundamental knowledge that you'll need in order to learn more advanced concepts, and you will likely not have much success without approaching these fundamentals (whether in CS50 or elsewhere). But don't expect that the course alone will put you in good stead all by itself. More likely, it will simply help you get set up to learn further.

$\endgroup$
6
$\begingroup$

The course is broad and it is short. It is no more than an introduction. It would, I think, give you an idea about whether this is a good path for you to take. But it won't carry you very far along the path.

It's breadth precludes much depth. Several languages are discussed. Several core ideas, from algorithmic thinking to data structures. It is, of course, that breadth that makes it valuable as a first course, as you get to look at a lot of things that will be developed more completely in courses that follow this one.

However, a deep knowledge of all that and more is needed for a career. It is a worthwhile thing to do as a starter, but expect to need more. If it is successful, then you will wind up wanting more, actually.

And don't expect it to be easy, assuming you want to learn much from it.


Note also that an undergraduate "major" in CS in the US is normally 15 or more CS courses (in addition to math, etc), of which this would be the first. You probably don't need all of that knowledge from 15 courses, but they are what forms the "foundation".

$\endgroup$
1
  • 1
    $\begingroup$ If anything, I found my degree didn't cover nearly enough. For example, there was no exposure to databases in the base curriculum. I took a database elective but it only covered theoretical and running queries by hand, not actually anything about building an application connected to a database. I agree with "learning how to learn" since specific tools can quickly go obsolete, but an application connected to a database seems like a fairly common topic........... $\endgroup$ Feb 20, 2020 at 21:26
3
$\begingroup$

Starting with CS50 is good, but it's just a beginning.

I'm a newbie in programming, and I started learning it with many sources including CS50. (As far as I know, CS50x is almost the same as CS50. if it's not, please comment me. CS50 is Harvard's computer science course for very beginners.)

CS50 is a very good course for a beginner, especially if you wanna grab the whole picture of programming but not going deeper too much.

It starts with learning C, so you can learn the basic concepts of memory address and pointer. And it covers modern languages such as Python(of course only basics though), and also you'll even learn some simple web development.

So, if you're a beginner and don't know what to learn first, then CS50 is a good way to go.

But I think you should dig much more to get some knowledge of CS undergrad. In CS undergrad, you learn algorithms, data structures, networks, operating systems, computer structures, etc. These are very very important if you wanna become a high-level software engineer.

$\endgroup$
0
$\begingroup$

Yes. It worked for me. I wrote about it on my blog:

https://andydavi.es/blog/I-took-CS50/

https://andydavi.es/blog/how-to-become-a-software-developer-in-nine-months/

$\endgroup$
6
  • 3
    $\begingroup$ Hey andydavies, welcome to Computer Science Educators! I have d/v'd for two reasons: first, as a general rule on the SE network, answers with links should contain some sort of (short) summary of the takeaway in case the link goes dead. More importantly, though, is software engineer/software developer confusion. Software engineering is a related field, but with a somewhat different center of gravity. (Take a look at BenCottrell's answer to get a reasonable sense of Software Engineering, or google software developer vs software engineer.) $\endgroup$
    – Ben I.
    Feb 19, 2020 at 15:26
  • $\begingroup$ @BenI. Ok...just trying to be helpful. Developer...engineer...I've read the definitions online and I can't tell the difference between them. Both describe every software job I've ever had. $\endgroup$
    – andydavies
    Feb 19, 2020 at 15:37
  • $\begingroup$ That's totally fair! And to add to the confusion, sometimes the terms are used synonymously, and on projects with smaller teams, all of the jobs merge so that everyone is doing both. But, in case this helps you, a specialized Software Engineer may do very little coding during their day to day job, instead spending their time going back and forth between the clients, upper management, and the software developers, while a software developer's job would typically center on generating good, carefully-crafted code. $\endgroup$
    – Ben I.
    Feb 19, 2020 at 16:15
  • $\begingroup$ Perhaps this will help! $\endgroup$
    – Ben I.
    Feb 19, 2020 at 16:16
  • $\begingroup$ Thanks for the link. I wonder if this is a US thing (I'm in the UK). The distinction that article describes is more Senior Developer vs Developer here. But anyway..doesn't matter, it's just a word. Peace. $\endgroup$
    – andydavies
    Feb 19, 2020 at 16:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.