tags:

views:

answers:

I'm what I think would be considered an 'advanced' programmer. I have years of experience doing reverse-engineering, kernel/compiler/emulation/game development, many programming languages under my belt, etc. Up until about two years ago I felt I was continually learning about coding, and I was a good coder but my overall development (documentation, management, organization, etc) skills were poor, so that became the focus of my learning. Now that I feel those have matured to the point where it's not worth complete focus, although obviously I still have a ton to learn, I now feel like my learning has largely stagnated. I had prided myself on learning new things constantly, but eventually there comes a time where the interesting things to learn are few and far between.

I've been trying to come up with little exercises to continue advancing my knowledge -- building a Tokyo Cabinet type DB being my latest idea to that end -- but I'm simply running out of places to go. It's having a definite effect on my morale as I move forward, feeling like I'm nearing the end of the road, so to speak, despite that I know there's far more out there I haven't even considered.

So my questions are these: How do you go beyond this point? What programming exercises, big or small, will expand my mind? Lastly, has anyone else out there hit this point, and how did you get over it?

Edit: I want to clarify a bit. I don't think I've learned everything there is to know about my fields, or anywhere even near it. I know there's a lot left for me to learn, but I simply don't know what that actually is, which is largely the point of the question. In addition, I've wanted new ways of expanding my skills as a tech person, not just as a coder, so thanks to everyone that's given such recommendations. There's a lot to take in here, but I think this will all help greatly.

+43 A:

I feel your pain. It must be very tough being so good you know almost everything. How about spending time teaching others of lesser abililty? That might inspire you again.

I'm hoping I didn't come off arrogant in my question, as your answer could be construed as sarcastic -- if it did, it wasn't my intention. Anyway, I try to help out where I can, doing live lessons on everything from low-level concepts through advanced networking, but I want to feel forward movement

Phil's answer might be unnecessarily sarcastic but he does have a point - the next logical step for you, in my view, is to do more mentoring/leading (not necessarily management). The world needs mentors...

It is amazing the things you learn from mentoring other people. A different perspective on the same topic can do wonders. Plus you don't really know if you know a topic until you start fielding a ton of questions from others...

I havent hit this point, so take my advice lightly. I think you need to take visit a few university websites and see what people are publishing in the fields your interested in. That might give you some inspiration.

I don't see a mention of Functional Programming, or other paradigm shifts. While I haven't personally gone through the "Ah-ha!" that such a paradigm shift can give you, it makes sense that such a change in your style will give you a new perspective on programming in general.

I didn't want to delve too much into technology, but I recently (about a year and a half ago) delved into functional programming as I started getting into high-performance emulation, where the metarograming from FP shines. Thanks for the input, though :)

I am kind of person who too hate being static. So what i will usually do, find my interest in some other parallel field. Another challenge in another language, domain, project etc.Some time contribute to open source projects as well. As being a developer of almost each platform i feel this thing always give me courage to learn more and more.

Try pushing yourself outside your comfort zone. For example, you mention that you know many programming languages, but if they're all they're all C variants (C++/Java/C# etc etc) then try exploring more esoteric ones like Lisp/Scheme/Haskell/Smalltalk. I've found that my doing this it gives you greater insight into the coding process and really helps you come up with alternative solutions to problems.

I'd not delved into other language classes until a year and a half or so ago, but I started doing Lisp/OCaml/Nemerle/F# stuff and fell in love with it. That's the type of paradigm shift I'm looking for to push me forward, but I can't find the next one. Thanks, though, for your input :)

Do you mean coding or programming? Because to me there's a difference. I'm far from being in your situation, but if I were you, I would either try to create familiar things in new environments (another web app in Java if you're into .NET), or rather explore the creation of developer tools (MVC frameworks, IDEs, ORM tools for example). After all it all depends on what you like to do. If you're into architecture, find a very big project/framework to design. If you're into algorithms, then find something to optimize. If you're into programming languages, then learn one new each month (I'm sure you haven't worked with all of them).
Then the other option is to dive into something different than coding. Probably try to improve the development process in your organization, dive into management, or write a book. This is very subjective actually, I'm just listing all the options I would consider.

I've done the first 2 quite a bit, the 3rd less, and hadn't even considered the 4th. Now that I see that, I can't help but wonder why I'd never even thought of it before. That's the type of answer I'm looking for -- thanks a million.

Oh, so you are bored with the tactical level aspect (=coding) of software development? Well, maybe you can indulge in the world of software architectures or requirement engineering. That's one step up in scope. No worries, you will quickly find 10 textbook-like books to absorb.

Or you can go one step down in scope and indulge in computer science, complexity theory (how about the P=NP problem), quantum computing, language theory or genetic algorithms. These are distinct fields.

Or you can enter the Ivory Tower of Mathematics.

2008-10-08 11:13:48

Well, I'm not so much bored with software development itself, as much as feeling like my skillset has been stagnant for far too long. As for other fields, I've never been much of a theory person, so I've avoided real CS and the like. Perhaps it's time to step up and give it an honest shot. Thanks!

This is definitely a good idea, and one I've done fairly often through the years. Windows->BeOS->Linux->OS X->Windows, with Solaris and BSD experience (on the server side) thrown in for the hell of it. Thanks for the input :)

That's a very interesting Matrix. Has anyone seen any discussion of it floating around? I am sure opinions differ on some of the criteria and a refined model for programmer competency would be a great tool.

I know this may sound sarcastic--but really I'm not being sarcastic. I'm quite serious.

Have you ever worked in an IT department and written code for an end-user? Writing a compiler or a driver or such like that, as hard as it is in its own right, is a different beast than dealing with constantly changing user requirements and actually interacting with the users of your products. It's not that one is harder than the other; they're just two different types of development and each has its own challenges and difficulties.

Edit:

Among some of the other challenges the IT department developer faces:

1.) Legacy code--maintaining and interfacing with.

2.) Unstable requirements

3.) Arbitrary and usually inflexible deadlines

4.) No choice of programming language (language is set for you by management or customer)

Doesn't hurt my feelings in the least. By hitting this point, I know there's a fundamental limitation in my mind that I need to change, and that's largely that point of posting this question. Thanks for your input :)

One option would be to find a business or industry that interests you. This does not necessarily mean a computer or technology industry. Just find something that you can get passionate about, you need to get into it pretty deep. Every company has room to imrove. The idea is to learn as much as possible about that business and its processes. Then design solutions that they need to solve their issues. You can approach this as an employee, consultant, independant software vendor, etc. whatever works for you.

I'd like to go this route, but right now I'm trying to get a company of my own off the ground, so an industry shift isn't in the cards. That said, this is still a good idea, and one that I've seriously considered for a bit now. Thanks for the input :)

Well, there is part of your answer then. Put everything you can into making this company as great as you can make it while learning more about business, accounting, marketing, legal, etc. Once you are established, hire experts in areas where you want more learning. Good luck with the venture.

I've had a similar problem... I know there's quite a bit more to CS than what I know, but pure CS is no longer interesting enough in itself.

I don't see embedded development in your list. The satisfaction for me of seeing a physical device move around under your control is much greater than pixel flipping on a screen. The challenge is also greater, in a way. When you can't trust your hardware or even your compiler things can get really interesting.

Plus, the average embedded developer is WAY behind, so you can really shine there. The scope and architecture of PC development dwarfs most any embedded project... so we're well practiced in a level of system complexity embedded developers can usually only dream (or have nightmares) about. If you can master the additional debugging and toolchain complexities in embedded development, you're way way ahead.

FPGA development is great for even more insane levels of control, speed, and complexity.

I've moved my contracts into about 1/3 embedded and FPGA development, and just about all of my hobby projects are now in these two areas. I plan on expanding that to between 1/2 and 2/3.

I'm generally much more motivated now. I have a long term goal again... learning any component parts required to build physical electronics products (being sure to have a lot of fun along the way).

Oh, by the way... in case it's not clear... there ARE significant challenges to embedded that WILL make your a significantly better programmer. So, if your only goal is to improve as a pure programmer, this is still a valid direction to go in.

Thanks for your input :) I actually do a good deal of embedded dev -- my kernel and emulation stuff is largely focused on high-performance x86 system emulation on ARM devices, so I deal with it a good bit. That said, I need to do more FPGA stuff, as it's very interesting to me. [...]

Oh, well great then. :) FPGA is a blast... there's nothing like making your own SoC. Check out Altera's Nios II Embedded Eval Kit. The C2H compiler is impressive. I am mostly Xilinx, but may be moving to Altera. I prefer VHDL, since that (or verilog) is what the compilers are generating anyway.

I have a nice little Spartan 3 board with an FTDI serial USB chip that makes computer interfacing damn easy. I'm a Verilog guy since it's so similar to C, but writing a compiler is how I like to /really/ learn a platform.

I've done a little compiler work (not for HDL). Extreme concurrency in FPGAs makes a compiler from high level languages tricky. You could generate not-so-efficient VHDL easily enough, but to get great HDL would be hard. There should be good money in any high level compiler like that, however.

I'm interested in it largely as a learning experience. I'd love to make some money from it, but I need a ton more experience before I understand the requirements of such a language enough to pull it off :)

FTDI is great! I've worked on so many *awful* USB chips I can't wait until a client actually selects FTDI. I always seem to come in after the hardware design. :( Spartan 3 is what I have the most experience in. For soft processors, Altera seems considerably more advanced (at the moment).

Oh man... check out the Nios II EEK and www.opencores.org. Basically, there are hundreds of FPGA logic cores you can integrate into your FPGA design. Many of them are 'soft processors', or FPGA implementations of 8051s, Z80, 68000, etc. Nios II and Microblaze (Xilinx) are 32 bit processors (cont)

... which have complete debugging and toolchain environments based on the Eclipse IDE. So, write C code to run on a virtual processor inside your FPGA. Instantiate as many cores as you can fit in an FPGA for multicore or multiplatform fun. :)

Do some work with databases. Large databases. From looking at what you do have experience with (reverse-engineering, kernel/compiler/emulation/game development) it doesn't seem like you would have had a lot of exposure to working with very large dataset, or even using databases. Take a look at the web technologies. There is a lot to learn when you have a system that will be accessed by thousands of people at a time, with hundreds of gigabytes of data that they will be accessing.

You know, as much as I've resisted web dev in the past (I started out doing PHP stuff on the web, but quickly moved to client-side PHP and then to more sane languages), it's definitely a big paradigm shift and something that I could greatly benefit from. Thanks for the advice :)

You take everything you know. Find the most annoying problem that everyone has in some area you've worked. Solve it. Start a business to take money from people who need your solution. Works especially well if you really know the area you're selling to. Additionally running a business requires a whole new set of skills and will let you see your old positions from a new perspective.

Not to seem flip, but get used to the feeling. All the best people I've heard always are striving for a better problem, better tools and mastery of the tools. I've heard Donald Knuth speak and read a bit and he only seemed interested in the next problem. I'd add that getting some work into the open source world and listening carefully to all feedback will go a long way.

This doesn't really surprise me, but it brings up another question: How does one determine where to go next? I guess you can just scan your existing knowledge for holes, google around for related subjects, and sit on SO looking for questions about new topics, but it seems... hit or miss.

It sounds like your motivations are changing, which can feel disorienting when you've relied on the old set for many years. First, please be assured that there are plenty more technical challenges out there. If what you want to do is program, you can keep programming new and challenging things forever.

About five years ago I went through what seems like a similar crisis where I lost my old set of motivations. Two things helped get me out of it:

I held a session at an open space-style conference called "Re-Lighting the Fire" where a bunch of us talked about similar experiences. This helped me understand that I wasn't alone.

I kept programming. Pretty soon I hit a project that, well, re-lit all the fires. This helped me remember that I'm a programmer who loves programming and that I should keep programming if I wanted to be happy.

Something else that helped me was taking some time to understand why I was dissatisfied. One thing I found helpful was "morning pages", where I sit and hand write two pages in a notebook without ever letting the pen stop.

Even though what you are going through is hard, this is an opportunity for you to take your skills and apply them at the next level. I wish you success.

Do something new. Anything. Web development, desktop development, Flash. Get out of your rut and find something enjoyable to tinker with. We all get to this point, and honestly, that's when I left my last job. When I stop learning, I quit. Personal enrichment is great, but couple that with a working environment that promotes that amount of keeping current and you're gold.

[In the analysis of Coding War Games
results, 1977 - 1986, we found that]
people who had ten years of experience
did not outperform those with two
years of experience. There was no
correlation between experience and
performance except that those with
less than six months' experience with
the languages used in the exercise did
not do as well as the rest of the
sample. (Peopleware, p. 47)[2]

it sounds like you're on the edge of burnout; been there and back again a few times. here's some things to do to change your perspective, which might help you relax enough to find your next passion:

turn off the computer and go outside. This is critical. I am not kidding. Remember to wear pants.

talk to a real person, face to face, about something other than computers; bonus points if it is a woman not related to you

take a few days off - or a month; travel; visit a museum (not a computer museum).

go hang out in the arts district of your town. Talk to some artists. Realize that some people live rich, fulfilling lives without ever using a computer for anything significant. Then get some chalk and draw on the sidewalk (no flowcharts!) until they run you off, or ask you to join their art colony.

etc. The point is to get your head out of bit-land for an extended period of time so your brain can de-saturate.

when your head has cleared, then go to a good university library, pick up an ACM or IEEE Computer publication at random (any of them), and start skimming. The field of computer science is enormous, and growing/changing rapidly. There is far more to it than language X or database Y.

You have a great gift - how are you going to use it? Can you change the world? Should you?

I'm nowhere near reaching this point, but why not champion an underutilized language you enjoy the style and strength of? If I were in your shoes, I'd try to revolutionize the language I enjoy, and find nifty in and of itself, and turn it into something better. For me this would be LISP, which I find highly attractive except for the lack of freeware non-SLIME based tools.

Certainly you could write your own programming language, but why not champion something in need that you happen to already enjoy?

Best of luck in continuing to learn, Cody. I hope you find something to apply yourself to, and enjoy doing it.

I did exactly the same thing - went off "into the wilderness" and honed new business analysis and consulting skills (think: software development lifecycle) rather than development-specific skills.

Personally, I believe I add more value now because I can still apply technical experience (and mentoring), but also I can better communicate with business stakeholders and other team members.

The second thing I did was to align myself more with a specific set of products, e.g. MS SQL Server, rather than working as a broader IT generalist (as I had been doing). Now I have a deeper understanding (in a particular product line) and I get to do more intricate/detailed work.

Ultimately I think I'm probably a better IT Professional now, as opposed to being a good developer/software engineer.

Instead of looking into some specific area, you should try to get the chance to work together with 'expert' programmers ('expert' being 'more advanced than advanced'). Interaction with others and learning from their experience is invaluable, because you can ask a question about each little detail and learn WHY some stuff is better done some way, instead of just HOW.

A good way to get to work with top programmers is to join some open source project and contribute to it. People tend to be more polite when you're helping them for free ;)

Move yourself down a level, and learn embedded systems programming and electronics / robotics. You already know some ASMs so the learning curve will not be anywhere near as steep. Build your own ALU out of logic gates and you will learn a ton about computers! :)

Edit: Or, genreate a PAL/NTSC video signal using no external hardware and just a R2R ladder! :)

The best way to advance is to ask someone who you want to emulate what you can do to improve. You probably have some programmers / computer scientists that you look up to and think "I'd like to be like that some day." Ask one of them to be your mentor and accept their guidance in your development.

My opinion is that you have several routes:
1)Enhance your academic credentials. I'm guessing you would be looking at a PhD. That's a challenge. Can you do it? Do you want to? It would push you very hard.
2)Move into engineering. Coding gets old after about 6 years or so. But can you engineer code? Design and develop systems? This is a very difficult thing(in my opinion).
3)Move into business/management. Can you manage coders? Can you manage projects? This is a huge challenge for many people.

You could try learning more math. (full disclosure: I'm a math guy 8^)

The idea being that at this point in your development, you've got "details are ephemeral, but fundamentals are forever" down pat, and math is the most fundamental thing out there. Another way to look at it: if you're running out of new things to program about, learning more math can give you that.

Exactly what math to learn depends on what catches your interest. Doubtless you have all the basic CS stuff down pat, but there's way more CS stuff out there than any one person can learn. If you can bring your honed development sense to some of the more arcane algorithms out there, you'll do us all a favor....

Alternately, there's the kind of quantitative stuff like in Numerical Methods, which is similarly endless. The flavor is very different from the discrete stuff you get in conventional CS, and doing it right requires broad comprehension, deep understanding, and close attention to detail.

Since you are 20 years old, I hope that you will read this post and reply to it when you are 40. Frankly, I think two things are happening here.

1) you've lost some inspiration. There are tons of areas you know nothing about, but you do not feel drawn towards anything. I say continue to search and fine your inspirado.
2) Technical knowledge is the easy part of becomming a programming guru. The only way to move from adept to guru is wisdom. Code wisdom is only gained from experience.

My advice: go work for or collaborate with someone who will school your arse. You know that there are better programmers out there than yourself. Search one out and let him/her teach you.

I'd recommend reading up on different design patterns (as most people gloss over this area of programming), and then toying with some 'exotic' programming. Neural Networks. Adaptive algorithms. Compression logic (build a better .zip!). That sort of thing.

If in doubt, contribute to an open source project. There's a nigh-infinite realm of learning there, as it's being written more quickly than you can possibly read.

Make a game. And put your skills and knowledge to the test on it.
Games have the advantage that not even the sky is the limit if your doing it for fun (as opposed to for work). You can just keep shooting higher and higher until you decide its enough.

I know how you feel. It happened to me differently, but I got to a point where I said to myself "how many more problems of logic am I going to solve"? Problems of logic were boring.

So I left programming for a couple of years and did management, where I encountered something called "business strategy". This was not boring and I was good at it. I found that I was good at it because it was a problem of logic, but was about something else - called the "bigger picture".

When I got back to programming I realised that software architecture is much like business strategy and that there is something called "design". Not UML and model-view-controller models etc, but something more intuitive and holistic - ie the big picture. So I now create software architectures and in the process I write and manage code.

Now I am a developer and I run my own business and I'm not ever bored. Stressed, happy and sometimes very tired, but not bored.

I don't feel that you are "less inspired" than you've been before, you want to expand your views and therefore you ask this question.

Something I've done to keep my knowledge at top edge is to teach others, as the top voter states, this helps you get inspired. But teaching doesn't only inspire it gives you a great, somewhat, new view of your programming.

You might not have had to do this before, but when others rely on your code being good, you really need to have it good.

So what you learn from teaching is:

Keep your architecture good, simple, clean, explaining comments. Now this isnt something that you wouldn't normally do, but if you lack the knowledge of commenting when you work at Microsoft, well, tuff luck, people need to adapt, noone is really failing because your commenting is bad. BUT! When you Teach, your skills need to be 10 levels above the students and you really need to think about simple things, such as commenting and common structure.

The other thing is of course social skills, even though you somewhat teach here on SO, it's not the same as going into a classroom and start explaining how to do a C compiler in assmebly.

Many people hate to teach and stand infront of people. And if you are one of those, surely you are not left to the wolves, Filip got another suggestion for you; Start a Blog. Now that might sounds somewhat stupid and retro, but think about it; How do you get readers? Well you write about common interests and you do it well. Meaning that you need to be speaking at a "teaching" level, having people to question your reasons but you will easily answer them!

So this takes you back to the start, what should you teach or blog about? Well you must have a programming hero or somewhat, we all do ( stupidly enough mine is Bill Gates, yes yes laugh all you want. ) and think of; how will you exceed this persons knowledge? Is it possible? ( If we talk about Jon Skeet, No, but don't quit, just because you can't become a God doesn't mean theres no chance for you ).

You must have some old code lying around, how about, taking that code, analyze it and just re-write it? What good will come from this? Well for starters you probably have a little bit more knowledge than you did when you wrote it, so what should you re-write? Sure there is no purpose in re-inventing the wheel? Of course not! Architeture is the fundamentals of life, what would we do without the pyramids or other such cool stuff from back in the days. Architecture in all manners are highly important and too this comes great responsability, take your code, analyze it, re write it, giving it a new, nice, architecture. I always programm as if 100 000 other programmers will use my "API" each day, so i need to keep it clean, commented and functional.

And when you do write code having the structure as a focus, you start to think about other parts aswell, how do i really test the functionallity the best way? what do others need and what do others think that this part actually does? This gives you; The mind of a teacher.

Im gonna end this, feeling endless, post with some project suggestions that might be interesting:

Having your Cat send you an Email ( Read the book How to make things talk )

Create your own alarm system

Implement your own Smart Home

Take the two best applications on your computer, and write a merged version

Re-write facebook

Create a Jon Skeet Robot

Learn about Musical Programming

Human Readable Compilation ( A language for non programmers )

I know this post has been fun to read because i put a lot of effort in making it such, there are however a lot of good information here and i hope you will get some insight in my views.

I'm a novice programmer at best, but my recommendation would be to try and utilize what you have already learned. I too have a deep desire to learn, but my desire to create takes priority 99.99999% of the time. The whole reason I got into programming in the first place was to build, the skills needed to do so were an afterthought. But what do I know?

2009-01-28 19:36:40

A:

Read SICP. It's an introduction to programming. I can assure you that most things you'll learn in this book are new to you if you haven't read it already (writing a compiler for Scheme for example).

From what I have gathered, the things you have been doing have mostly been in exercise in conventions. I have dabbled in those areas you described yourself and in 90% of the time was spent learning conventions such as calling conventions, stack layout, OS API, syscalls, peculiarities, etc... There is one layer deeper than this, and that is to design a CPU (one with modern features like pipelines and parallel arithmetic) by yourself. This subject alone could keep you occupied for a lifetime and you will learn much about computers as I did.

Reverse someone's encryption algorithm in assembly (would not do again, I was really bored at the time)

Design your own encryption algorithm.

Bioinformatics

Yes I noticed someone else had this section, but as I have studied some of this field in college, I feel that it is infeasible for you to learn about this outside of an institution. Also "a good genomic IDE + synthetic DNA compiler" is really only within the realm of Craig Venter ( who happens to be working on that right now) and other cutting edge groups.