views:

1991

answers:

31

Let's say your company has given you the time & money to acquire training on as many advanced programming topics that you can eat in a year, carte blanche. What would those topics be and how would you prefer to acquire them?

Assumptions:

  • You're still having deliverables to bring into existence, but you're allowed one week per month for the year for this training.
  • The training can come from anywhere. IE: Classroom, on-site instructor, books, subscriptions, podcasts, etc.
  • Subject matter can cover any platform, technology, language, DBMS, toolset, etc.
+42  A: 

Concurrent/Parallel programming and multi-threading, especially with respect to memory models and memory coherency.. I think every programmer should be aware of the considerations in this arena as we move into a world of multi-core/multi-cpu hardware.

For this I would probably using Internet research most heavily; but an on-campus primer at a good university could be a good way to start off.

Software Monkey
This is a definite yes. I'd say any treatment of this really requires some coding too though. You can't really grok the headaches you are in for in concurrent programming with badly synchronized resources until you have had to debug a couple yourself.
T.E.D.
@Ted: Good point; I must confess, I assumed that in the context of this question the OP is also "doing" as part and parcel of his job.
Software Monkey
+4  A: 

I am from MS based developer world, so here is my take on this

  1. More about new concepts in Cloud Computing (various API etc.). as the industry is betting on it for sometime.

  2. More about LinQ for .net framework

  3. Distributed databases

Samuel
You saved yourself a downvote with the Distributed Databases part. The rest is ... meh.
T.E.D.
Cloud Computing is still hot in my agenda. Not because of the things in the cloud, but to use it efficiently you need to learn many concepts that are different from the traditional way of doing things. For example while looking at Microsoft Azure, it was interesting to find out about how database services concept was different from the traditional databases to take advantage of distributed scaling in the future.
Samuel
Call me with the cloud when the industry has settled on a non-proprietary, non-XML API standard. Until then, it's business as usual.
Chris Kaminski
+3  A: 

Parallel computing- the easiest and best way to learn it

TStamper
+14  A: 

Object oriented design patterns.

chaos
I didn't vote you down because in a way I admire this answer. Do you think I too could get 13K rep if I daily made posts consisting of two intermixed sets of buzzwords? :-)
T.E.D.
Nah; you have to do it with style, like me.
chaos
rofl lmao :-)
T.E.D.
http://www.youtube.com/watch?v=iEWgs6YQR9A
chaos
+19  A: 

Here are the three that I'm always finding myself explaining to junior developers who didn't get enough CS training. All that other stuff is generally more hype than substance, or can be fairly easily picked up. But if you don't know these three, you can do a great deal of damage:

  1. Algorithm analysis, including Big O Notation.
  2. The various levels of cohesion and coupling.
  3. Amdahl's Law, and how it pertains to optimizations.
T.E.D.
Wait, what - are those advanced topics you have to explain? That's just sorry.
Christoffer
@christoffer - Take a poll among your co-workers. If even a majority can tell you what all those are, I'm jealous. I've never worked anywhere I could claim that in 20 years in this business.
T.E.D.
Heck, I thought "Big O" was some redneck grocery store in Southern 'Bama. {-o)
Boydski
You mean Big-O from Paradigm City? http://www.paradigm-city.com/robots/bigo.php
Zack
+6  A: 

NP Completeness. Specifically, how to detect if a problem is NP-Complete, and how to build an approximate solution to the problem.

I see this as important because you don't want a developer to try and solve an NP-complete problem by getting the optimum solution, unless the problem's search space is very small, in which case brute force is acceptable. However, as the search space increases, the time required to solve the problem increases exponentially.

Jean Azzopardi
http://www.codinghorror.com/blog/archives/001270.html
Tim
I was aware of that already, thanks boat-programmer.
Jean Azzopardi
Sorry, my comment was missing the point that one needs not have any clue what NP complete is or the P=NP debate to be financially successful. You just need to have a bunch of blog readers.
Tim
That may be true. Honestly, I think that Atwood does know what NP-Complete is, he just tried to dumb it down for his blog, and lost the meaning. Well, that's what I hope, anyway. Otherwise, I'd say that to be a good programmer, you do need to know what NP-Completeness is.
Jean Azzopardi
Ont he contrary - it is clear that he has no idea what it is. This is his second attempt in a blog and he tried at least once in the podcast to explain his understanding of it. he's a somewhat proficient web programmer - he has no idea about typical theoretical computing. There's no shame in that - it is just best if he left it alone
Tim
+11  A: 

Developers should know the basics in SQL development and how their decisions impact database performance. It is one thing to write a query it is another thing to write a query, understand the explain plan and make design decisions based off that output. I think a good course on PL/SQL development and database performance would be very beneficial.

northpole
Definitely true, if you develop with SQL-based databases. Since I've managed to work a 20 year carreer so far without doing that once, I don't think the blanket statement is true though. Well...there was that once in college. But we all experimented in college, right? Right?
T.E.D.
hahah..ya, true enough :D
northpole
SQL database-related development principles can definitely help in other areas. Also, a significant portion of available development employment does involve SQL database development, so you will only help yourself by learning it.
JeremyDWill
Relational database normalization theory and entity-relationship diagramming actually apply quite well to modelling data in programming languages too.
Jim Ferrans
so DBA and DB Experts should be fired? since they would be really useless.
01
+36  A: 

Security!

Far too many programmers just build something and think they can add security as an afterthought after finishing the "main" part of the program. You could always benefit from knowing more about how to secure your app, how to design software to be secure from the get-go, how to do intrusion detection, etc.

Advanced Database Development

Things like data warehousing (MDX, OLAP queries, star schemas, fact tables, etc), advanced performance tuning, advanced schema and query patterns, and the like are always useful.

Joel Coehoorn
Amen sir! Couldn't agree more!BTW - Love the avatar.
Boydski
good point, since nobody cares about security than programmers should.
01
+13  A: 

I guess "advanced" is different for everyone, but I'd suggest the following as being things that most decent developers (i.e. ones that don't need to be told about NP-completeness or design patterns) could gain from:

  • Multithreading techniques that go beyond "lock" and when to apply them.
  • In-depth training to learn and habitualize themselves with clever features in their toolchain (IDE/text editor, debugger, profiler, shell.)
  • Some cryptography theory and hands-on experience with different common flaws in security schemes that people create.
  • If they program against a database, learn the internals of their database and advanced query composition and tuning techniques.
mquander
+1 for improving toolchain and database skillz
Tshepang
+3  A: 

Debugging

Debugging by David J. Agans is a good book on the topic. Debugging can be very complex when you deal with multi threaded programs, crashes, algorithms that doesn't work. etc. Everybody would be better off being good at debugging.

neoneye
Definitely an important and undertaught topic.
Jim Ferrans
+7  A: 

I'm a book person, so I wouldn't really bother with instruction.

Not necessarily in this order, and depending on what you know already

  • OO Programming
  • Functional Programming
  • Data structures and algorithms
  • Parallel processing
  • Set based logic (essentially the theory behind sql and how to apply it)
  • Building parsers (I only put this, because it actually came up where I work)
  • Software development methodolgoies
Kevin
+8  A: 

One of the best courses I took was a technical writing course. It has served me well in my career.

Additionally: it probably does not matter WHAT the topic is - the fact that the organization is interested in it and is paying for it and the developers want to go and do go, is a better indicator of success/improvement than any one particular topic.

I also don't think it matters that much what the topic is. Dev organizations deal with so many things during a project that training and then on the job implementation/trial and error will always get you some better perspective - even if the attempts to try out/use the new stuff fail. That experience will probably help more on the subsequent projects.

Tim
+1  A: 

How would I prefer to acquire the training? I'd love to have a substantial amount of company time dedicated to self-training.

Larsenal
+2  A: 

I'd vote for real-world battle stories. Have developers from other organizations present their successes and failures. Don't limit the presentations to technologies you're using. With a significantly complex project, this is bound to cut into 'advanced' topics you haven't even considered. Real-world successes (and failures) have a lot to teach.

Corbin March
+19  A: 

Internationalization issues, especially since it sounds like it would not be an advanced topic. But it is.

jmucchiello
Localization, too. I've seen too many "internationalized" but only really have multiple translations. They don't take things like timezones or currency in to consideration.
Tina Orooji
Yes, I meant all of the various I18N issues - Translation, Date/Time, Currency, LTR/RTL, and even character encoding (even if that doesn't strictly fall under I18N).
jmucchiello
+6  A: 

I'd cover new technologies and trends. Some of the new technologies I'm researching/enhancing my skills with include:

  • Microsoft .NET Framework v3.0/v3.5/v4.0
  • Cloud Computing Frameworks (Amazon EC2, Windows Azure Services, GoGrid, etc.)
  • Design Patterns
arabian tiger
.NET? I would expect general useful topics here, not a specific technology. Similarly, learn about Cloud Computing _usage_, not about the different Frameworks. It's like saying that a good Software Engineer is someone who knows a lot of languages: it is just wrong, you have to know a couple, yes, but most of all, a good SE should be able to learn easily any new language. Flexible, smart.
NicDumZ
I agree with that. Reading up on current trends in software development should definitely be picked up by SE's. The original poster was referring to any technology, platform, etc. (see bullet point #3 in his question).
arabian tiger
+2  A: 

Go to the Stack Overflow DevDays

and the ACCU conferences


Read

  • Agile Software Development, Principles, Patterns, and Practices (Robert C. Martin)
  • Clean Code (Robert C. Martin)
  • The Pragmatic Programmer (Andrew Hunt&David Thomas)
TimW
+17  A: 

Accessibility

It's ignored by so many organizations but the simple fact of the matter is that there are a huge number of people with low or no vision, color blindness, or other differences that can make navigating the web a very frustrating experience. If everybody had at least a little bit of training in it, we might get some web based UIs that are a little more inclusive.

John Munsch
This is a worthy goal, but if you stop to think about it - small companies or companies putting out a new product are better off spending time getting a larger population/audience. Large companies with stable products can improve their revenue/market saturation by being more inclusive, but I don;t think that is the best advice with respect to payoff per developer hour... Unless of course your specific market is/are those people.
Tim
I would upvote this 500 times if I could.
Tina Orooji
+1: I wish I could give you a few +1's. This is perhaps one of the most ignored aspects of development today. So much is focused on the wysiwyg part of it, that we forget those who can't "s" in wysiwyg. :-/ I'm just as guilty of it as the next guy.
Chris Kaminski
@boat-programmer: Bear in mind that making something possible to use by the impaired can make it easier to use by the general public. Moreover, not everybody uses desktop browsers anymore, and not all fancy web pages work on my iPhone.
David Thornley
@David - I agree with you - I still think that in the early stages of development that is always going to be one of the items far down on the to-do list.
Tim
+10  A: 

Unfortunately communication skills seem to fall under the "advanced topics" section for most developers (present company excluded, of course). Best way to acquire this skill: practice.

  • Take of the headphones, and talk to someone instead of IM'ing or emailing the guy at the next desk.
  • Pick up the phone and talk to a client instead of lobbing an email over the fence.
  • Ask questions at a conference instead of sitting behind your laptop screen twittering.
  • Actively participate in a non-technical meeting at work.
  • Present something in public.

Most projects do not fail because of technical reasons. They fail because they could not create a team. Communication is vital to team dynamics.

It will not harm your career either.

Peter Stuer
+1  A: 

I totally agree on Accessabiitly. I was asked to look into it for the website at work and there is a real lack of good knowledge on the subject, not only a lack of CSS standards to aid in the likes of screen readers.

However my answer goes to GUI design - its quite a difficult thing to get right. There's too many awful applications out there that could be prevented just by taking the time to follow HCI (Human Computer Interaction) advice/designs. Take Google/Apple for inspiration when making a GUI - not your typical hundreds of buttons/labels combo that too often gets pushed out.

Finglas
+2  A: 

Well if you're here I would hope by now you have the basics down:

  • OOP Best practices
  • Design patterns
  • Application Security
  • Database Security/Queries/Schemas

Most notably developers should strive to learn multiple programming languages and disciplines, in order for their skill set to be expanded in more than one direction. They don't need to become experts in these other skills but at least have a very acute understanding of integration with their central discipline. This will make them much better developers in the long run, and also let them gain the ability to use all tools at their disposal to create applications that can transcend the limitations of a singular language.

Outside of programming specific topics, you should also learn how to work under Agile, XP, or other team based methodologies in order to be more successful while working in a team environment.

Juan Bonfante
+2  A: 

I think an advanced programmer should know how to get your employer to give you the time & money to acquire training on as many advanced programming topics that you can eat in a year. I'm not advanced yet. :)

Brad Mellen-Crandell
Best answer so far Brad!
Boydski
+4  A: 

Refactoring techniques (which implies also learning to write a good set of unit/functional tests).

Knowing how to refactor is the best way to keep code clean -- it is rare when you get it right the first time (especially in new designs).

A number of refactorings, however, require a decent set of tests to check that the refactoring did not add unexpected behavior.

Kathy Van Stone
Absolutely! Knowing how to refactor well is a paramount tenent of any Agile developer.
Boydski
+2  A: 

I'd suggest an Artificial Intelligence class at a college/university. Most of the stuff is fun, easy to grasp (the basics at least), and the solutions to problems are usually creative.

sjobe
+1  A: 
  • Automated testing: Unit testing, functional integration testing, non-functional testing
  • Compiler details (more relevant on some platforms than others): How does the compiler implement certain common constructs in language X? On a byte-code interpreted platform, how does JIT compilation work? What can be JIT-compiled (for example, can virtual calls be JIT compiled?)?
  • Basic web security
  • Common design idioms from other problem domains than the one you're working in at the moment.
Paul Morie
Please elaborate on "non-functional testing".
Boydski
Non-functional testing is testing for non-functional aspects of software like performance, memory load, etc. See http://en.wikipedia.org/wiki/Non-functional_tests
Paul Morie
+2  A: 

Hitchhikers Guide to the Galaxy.

dicroce
+1  A: 

I'd recommend learning about Refactoring, Test Driven Development, and various unit testing frameworks (NUnit, Visual Test, CppUnit, etc.) I'd also learn how to incorporate automated unit testing into your continuous integration builds.

Ultimately if you can prove your code does what it claims it can do, you don't have to be there to answer questions as to why or how. If a maintainer comes along and tries to "fix" your code, they'll know instantly if they broke it. Tests written around the requirements (use cases) explain to the maintainer what your users wanted it to do, and provide a little working example of how to call it. Think of unit tests as functional documentation.

Test Driven Development (TDD) is a more novel design approach that begins with the requirements, where you start by writing a test before you write the code. You then write exactly enough code required to pass the test. You have to stop before you write extra code (that you may never need), because you will refactor it later if you find that you really needed it.

What makes TDD cool is that a bad interface (such as one with lots of dependencies) is also very hard to write tests for. It's so hard that a coder would rather refactor the interface to make it easier to test. And that refactoring simplifies the code, removing inappropriate dependencies, or grouping related tests together to make it easier to test, thus improving cohesion. By making it immediately apparent to the developer when he's writing a badly interfaced module, the developer sticks to the architecture and gravitates to the principles of tight cohesion and loose coupling. Good interfaces are the natural result. And as a bonus, once you pass all your tests, you know you're done.

John Deters
+1  A: 

On the surface this seems like an easy question to answer, just enter your favorite pet peeve about what other developers can't do correctly. But when I read through the answers and gave it some thought, I realized that every "advanced topic" brought up was covered in my undergraduate computer science curriculum--20 years ago. And I doubt that OO, security, functional programming, etc. concepts have changed in that time. Sure the tools have, but I argue that tools are different than topics.

So what is an "advanced topic" in computer science? Who is the Turing, Knuth, Yourdon of the 21st century?

I don't have a clear answer to this question, though I'd like to see more work on theories for parallel programming that will enable tools to abstract that messy stuff for developers.

Dr. UNIX
+1  A: 

Quite funny that noone hasnt mentioned:

  • debugging.
  • tools & ide you work with
  • and platform you are developing to.

Everyday development is much more fun if you know your tools really well and you accomplish more and make your life easier if you know how to debug someone elses code at ease.

rasjani
Probably because these are the basics, not advanced topics.
Software Monkey
+1  A: 

Source Control

Zack
+1  A: 

For the Microsoft .NET folks

I think Silverlight is going to be HUGE for the next few and perhaps many years.

Jim Evans