

Ask HN: I'm a cs grad student seeking advice - chrs

I'm currently enrolled in a master's program in computer science.  I'm in my second semester and things seem to be going well.  I've only been programming for a little less than 3 years, and I didn't earn a BS in computer science in my undergrad.  What I'm looking for is advice.<p>I am not a good programmer.  I have been improving a lot over the last year, but I feel a bit overwhelmed by the amount of things that I need to learn.  There are so many different skills I want to have, but I don't know where to start.<p>Here is my question to you: What are the three most critical skills that you all think are absolutely fundamental to programming?  I eventually plan to do web development, but the skills needn't be specific to that.
======
strlen
0\. Managing Complexity

1\. Mastery of multiple programming paradigms: know a systems language like C,
a statically typed object oriented language like C++, Java or C#, a
dynamically typed object oriented language like Python, Ruby, Smalltalk or
Perl, a Lisp (Scheme is best for learning functional programming) and a
statically typed functional language with type inference (OCaml, SML or
Haskell)

2\. Great understanding of algorithms and data structures. Ability to look at
a problem and see a clean algorithmic solution or data structures based
solution where others see spaghetti and brute force. In addition to the
obvious (algorithms classes, CLRS, Algorithm Design Manual) books, Jon
Bentley's Programming Pearls contains many demonstrations of exactly that: use
of data structures and algorithms as a way to write exponentially more
performant, cleaner and more correct code.

3\. Understand systems: TCP/IP networking, I/O, parallelism and concurrency
(know how to write multi-threaded code, how to perform asynchronous I/O),
operating system and database internals, basics of hardware (pipelining/branch
prediction, memory hierarchy, NUMA)

------
apsurd
1\. Discipline.

2\. Motivation.

3\. Humility.

Explained:

1\. Logical thinking. Adherence to a scientific understanding of things.
Ability to troubleshoot. These things require a disciplined mind.

2\. Technology moves fast. It's not what you know so much as how much you are
willing and able to want to keep learning.

3\. Humility drives motivation. If you are never satisfied then you will
continue to improve and seek the guidance of people better than you. Humility
allows you to surround yourself with good people.

Overall, programming is about problem solving. But it takes the top 3 skills
to solve a problem I think. Solving a problem does not necessarily mean you
have to be smart, you just need to know how to approach it, who to ask,
how,what,why to ask, and when it all comes down to it, just getting it done. A
duct-taped working solution is better than no solution, and sometimes you need
to be humble enough to accept this, motivated enough to move forward and
iterate, and disciplined enough to actually learn your lessons and improve
over time.

------
stevetjoa
Perhaps the following posts on Stack Exchange may help:

What should a CS grad know?
[http://programmers.stackexchange.com/questions/16325/what-
sh...](http://programmers.stackexchange.com/questions/16325/what-should-a-cs-
grad-know)

Advice for nontraditional CS student?
[http://programmers.stackexchange.com/questions/39243/advice-...](http://programmers.stackexchange.com/questions/39243/advice-
for-nontraditional-cs-student)

Personally, I believe the most important language-agnostic skill for any
CS/engineering graduate student is the ability to model problems and solutions
with pen and paper before diving into the code. The theory lays the blueprint
for the house. The code is the bricks.

