Searching through google, I find interesting tidbits on what a good programmer should know/be able to do.
Here are some things I’ve learned and am working towards:
From a stack overflow question, and various authors:
Rule 1: Software is Knowledge Capture. Software means something. If you’re unclear on the meaning, spend more time talking to users to understand what they do.
Algorithms and Data Structures are two sides of the same coin. Algorithm depends on data structure, data structure depends on algorithm.
…You must learn several languages.
- Programming language (Java, Python, etc.)
- Shell language.
- Database language (SQL)
- Presentation languages (HTML and CSS)
- Other data representation languages (XML, JSON)
You must learn several data structures.
- Sequences (lists, tuples, files)
- Hierarchical (like XML and HTML documents, as well as the basic file system)
- Relational (like databases, and the file system with hard and soft links thrown in)
- Maps (or Indexes or Associative Arrays) including Hash Maps and Tree Maps
I found a good matrix that describes the levels of a programmer, from not-so-good to ubermensch.
Some concepts that helped my development (intellect and code):
- Lexing, Parsing, String matching, Regex
- Functional programming – John Hughes’ amazing article had me at “why”
These are whole domains of discrete math, but a serious introduction is required for CS:
- Matrix/Linear Algebra
- Graph Theory
Although lectures and articles by Mark Jason-Dominus are often directed to Perl hackers, I think any programmer would benefit from his clear presentation and real code, especially in Higher Order Perl.
- The relational model: Introduction to Database systems
- Object orientation : Object Thinking
- Complexity and computation theory (think Turing machines and automata): Introduction to theory of computation
- A little compiler design: The Dragon Book...
- Operating system concepts: Modern operating systems
- People skills: How to win friends and influence people
- Teamwork: Peopleware
- User interface design: The inmates are running the asylum
- The Five Essential Phone Screen Questions
- It goes into some detail about the the five most important concepts that developers should be required to know:
- Basic programming (including recursion, file I/O, formatted output, loops etc)
- Object oriented design (including design patterns etc). You should be able to produce sensible OO designs as well as understanding the concepts.
- Scripting and regexes.
- Data structures — lists, sets, hashtables, trees, graphs, and so on — as well as Big O notation and algorithmic complexity.
- Bits, bytes and binary numbers — how numbers are represented within the computer, and how to manipulate them.
For me I got a lot from the following course at varsity
- Project Management
- Human Computer Interaction (Helps us geeks make more user friendly screens)
- Database Design (Including how databases work, transaction logs, locking etc)
- Data warehousing
- Graphics (OpenGL)
- Advanced Algorithms
- Data structures
- Things I wish I had done at varsity
- Compiler Construction
- Design Patterns
- Automata theory
- A lot of good responses have been mentioned here already, but I wanted to add a subset of what is important, but hasn’t been covered so far.
- After 15 years of post-undergrad professional Software development, I find that I regularly use some of the following concepts from in school:
- General OO concepts, and modern programming language features (classes, data hiding, etc).
- Algorithm performance metrics (Big O notation). When designing an algorithm, performing a Big O analysis to determine the cost of the algorith, and looking at more efficient alternatives in bottleneck areas.
- Linked lists and other complex data structures.
- Fast sorting, and different sorting concepts.
- Trees and fast tree manipulation.
If your language/platform doesn’t support Garbage Collection, memory allocation and cleanup are critical, and would be added to the list.
- Relational Database Design: Keeping track of data is like Arnold in “Kindergarden Cop”.
It can be total chaos. It must be controlled.
How to keep your data, in the fewest locations, with the fewest duplications of information. How to keep your data light, and easily accessible. How to control data growth and integrity.
- User Interface (UI) Design: This is how the User must access the data we’re keeping track of.
Most UIs are designed by developers. Thus, most UIs, unfortunately, parallel the database design. Users don’t care about the data design at all. They simply want, what they want. They want to get it easily. Usually this demands great separation from the data design and the User Interface. Learn to separate the “engineering” you from the “southern-hospitality” you.
- Object Oriented Programming: Many languages boil down to this format.
- Parallel Processing – Multi-Threading: Many processors make the work fast!
Parallel computers have been around for decades. They’ve been on our desktops for some time now. With the event of “cloud computing”, massive parallel processing is not only manditory but also preferable. It is incredibly powerful! There is a lot of job potential for parallel developers.
- Understanding Business Rules: This helps you make a lot of your logic, table-based.
Many IFblock conditions can sit in business rule tables. To change the logic, just change the information in a table. Little/No recoding. Little/No recompiling.
- Events Supervise…Methods do the work:
Keep things separate in your code. It makes it easier for others to make updates in the future. It also somewhat parallels the Model/View/Controller (MVC) framework.