Taking Your Programming Skills to the Next Level?
An anonymous reader asks: "About 6 years ago I graduated with a degree in Computer Science. Since that time I've been working on and off as a programmer, however I feel that my programming skills haven't really progressed to the next level as I had hoped. I guess part of the problem is that my work environment hasn't been especially technical or challenging, so I really need to try and improve my skills independently. What strategies did Slashdot readers use to improve their programming skills Which books are useful in this area?"
Practice. Learn a new language, just for fun. To do so, program a new application to do something useless that has been nagging you for months.
If your current job isn't challenging you, then get out of it now. Do not delay.
All you are doing is painting yourself into a corner skills-wise that is going to get harder and harder to get out of later. The longer you're doing this basic stuff, the rustier and rustier all the real actual knowledge you got out of your degree is becoming.
Employers don't want rusty people, they want people with skills already.
Get out now.
NZ Electronics Enthusiasts: Check out my Trade Me Listings
Typically, you have to rescue a kings daughter or defeat a marauding ogre that has been terrorizing the townsfolk. That's how I got to be a level 9 Programmer, although the +2 keyboard, +3 against fire elementals, does help. If I take it to the next level, I get an enchanted chair.
there is no need to sign your posts. this isn't usenet. your username is right there above your post. stop it.
To me, it sounds like you are not really that interested.
Learn assembly language and write a simple app like rudimentary text editor or line-art drawing tool, something that requires most of the basic IO functions. (Then try an application launching menu - yay memory management! :)
This will give you a foundation that will apply to every other language in the world and damn-fine debugging skills as well.
I have a feeling that I'm going to be modded troll, but if you know how to program properly you can teach yourself any language without much difficulty and therefore tackle any challenge you place before yourself. Give yourself and insanely unrealistic task and then force yourself to follow through on it. If you can mentally build a road-map to making it happen, you're ok, if not, you may wish to try a new career or remedial programming courses.
Did you ever notice that *nix doesn't even cover Linux?
but have you considered helping on a open source project? Depending on the project (and yourself) you could learn a lot. It being a real project with a real team, etc, should sufficiently motivate you.
As for books, pick up K&R & read it, work the execrises, repeat.
Best of luck.
I would recommend volunteering for a GPLed project in a domain that you want to improve your skills in. The real-world issues you'll face will surely improve your skills in domains thet you are interested in. The books/material you would have to read will get driven by this project's needs.
This is not my sig.
I had a job at a large corporation...not too much programming, but (eventually) lots of networking, support etc..
I streached my wings and found places where I could do some programming to expand our capabilities, still within my job function.
Eventually (after about 7.5 years at that company, which I started at straight out of college), I quit (lots of other reasons, but I was also just burned-out and not challenged enough). I took about 8 months off, learned C (only got Pascal and a smattering of other languages in college), and developed a variety of windows based utilities etc.. Not so much to sell, but as a learning experience. After that break, I slowly started back into the regular work-force, but aimed myself at a programming job (but now had lots of other experience behind me).
Now I have a great programming job, working on a variety of projects, and lots of flexibility.
I never had aspirations to be a game developer, business oriented applications and services are more my speed. Try to decide what area you want to develop in, then aim yourself via classes, books, etc. towards that goal.
Give a hand, not a hand-out.
Six years out of school and "programming on and off" seems strange. What kind of programming do you want to do? GUI stuff? Graphics? Games? Algorithms? Databases? Real-time?
One way to get better as a programmer is to do maintenance programming on code written by someone better than you. Learning to understand someone's thinking by reading their code can be a worthwhile exercise. It's also useful to be able to write in someone else's style.
Right now, something worth getting good at is understanding how to write highly parallel programs that are reliable. Write something that has lots of intercommunicating threads and be confident the locking is correct. There aren't that many people who consistently get that right. You have a CS degree, so you have the theory for that. Put it into practice. The world is full of underutilized multiprocessors. Learning how to write safe concurrent code will definitely make you a better programmer. (It will also make you realize how bad most mainstream programming languages are for this.)
On the language front, today I'd say that you should be good at either Java or C++ (C# if you're in Microsoft land), and either Perl or Python (VB if you're in Microsoft land). One strongly typed language that goes fast, and one weakly typed interpreter. Basic familiarity with the HTML/PHP/Javascript world is useful, but don't spend all your time on the details of that - that's for low-level programmers with two years of experience. Also, learn how and when to use a relational database, at least at the MySQL call level.
...No seriously. If you join an IT department where you're the "big fish in a small pond" people will start to notice, they'll give you the tough jobs (note: NOT read as "fun" or "challenging") and because the rest of the IT department is crap they'll pile it on and I mean it. If you find the right place (i.e. the worst place) they'll stack it up and then slam you for not getting it all done sooner.
Instead of sinking under all that work, it will become you're motivation to raise your game and plow on through. You'll find new techniques to get work done, you'll learn to identify the patterns that get work done in the department and you'll invent new processes out of those patterns. When you start to succeed, you'll master your job and maybe a programming language or two.
Then when you're feeling confident about your skills, QUIT that job and go join a firm with a good reputation, knowing full well you're ready to play with the big boys.
But seriously, don't go searching for a book or learning material. Search for MOTIVATION. It's through motivation that we test how much weight we can pull and it's motivation that will select the subjects that we want to study the most.
Height: 38U, Weight: 0 Newtons, Eyes: #0000FF, OS: Gray Matter 1.0 (Alpha)
Being a programmer myself and looking for answers, finding most of them on my own and finding other on this thread :), i find some interesting observations.
To be a good programmer you need practice for sure, but you need stimulating challenges to work on.As in my case i found that to be the Linux kernel.I may not be the best of the kernel hackers but yes i have a passion for kernel.I work on an entirely different area at work, which is C++. But my inqusitiveness and quest to be a good software programmer has led me to realise one thing, you are on your own. Try to learn from your mistakes. More you make them, more you learn.And who knows down the line may be after a couple of years you can be a pretty good programmer.
Working for a GPLed project is a good idea but you need certain level of expertise for it. And effort you put into your passion for programming will get you to that expertise. Once it is achieved you can choose a GPLed project of your choice and certainly you ll hone your skills for sure. Good luck :)
-- "Genius is 1% inspiration and 99% perspiration" - TAE --
What was your minor in college? Sounds like someone needs a change of scenery.
-- I prefer the term "karma escort."
I recommend you the following essay (or any by Paul Graham for that matter):
http://www.paulgraham.com/avg.html
If you have a boring programming job such as coding Java web apps (as I do) it is particularly important you turn away your attention from the mainstream (e.g. the framework of the week) or else you too may become yet another boring corporate drone.
It is also very important to avoid fads (such as PHP) as well as stuff that gets a lot of attention but only because of the huge publicity behind it and the swarm of clueless people who fall for it (.NET, Windows whatever)
Finally, it is essential that what you work on is interesting in itself (to you, of course), otherwise no matter how effective a way you find to make it, it will fail to inspire you and without inspiration your mind will deteriorate.
Even though I have 29+ years of programming, I have never worked for a company that had its stuff together as far as product development. They all were poorly conceived, constant moving targets dictated by the sale's department's conversation of the day.
As far as learning new languages go, that's fine - if you are not already there - I was at the point quite a long time ago where 'its just another language'.
I finally forced myself to do some small projects in text book perfect approach - requirements - use cases - UML models (and appropriate design (not refactor) patterns - Test driven development. The results were some incredible complex multi-threaded x25 to tcp bridge code that worked first time and was a pleasure to enhance. Never before had I experienced that, and never again since either.
Anyhow, that was a personal accomplishment / satisfaction. Now if I could only find a company that builds software this way.
slashdot troll = you make a compelling argument I do not like the implications of.
There are many many sub-disciplines of computer science out there, and the "next level" you're looking for probably involves some degree of specialization. Data mining? 3D in gaming, or photorealism? UI concepts? P2P? I think you're looking for a focus.
White programmer needs Dew badly.
I don't know about books per se, but these links help:0 Patterns/
P rogramming.html t icles.html
http://joel.reddit.com/
http://programming.reddit.com/
The design patterns book website with, as I understand it most if not all of the content for the book:
http://lci.cs.ubbcluj.ro/~raduking/Books/Design%2
The next three I keep the bookmarks to in a folder called "Practicing programming:
http://www.devblog3000.com/archives/2-Practicing-
http://butunclebob.com/
http://www.objectmentor.com/resources/publishedAr
I don't think improving your programming skills is really a worthy
goal in itself.
You can be the most skilled programmer in the world, but if you
just spend your time working on private projects or Top Coder or
whatever then you are no use to anyone.
To many people programming is an overly academic exercise in
self-improvement or entertainment, but really what is it is a valuable
engineering skill that can be applied to make a positive difference in
the world.
If you work on projects you are passionate about the rest will come.
- Code bashers - these are people who bash out endless lines of cobol (probaly VB nowadays) with no real feel for the craft
- Hippies - Hippies write good code badly. Once the problem of how to code this task is resolved they lose interest so the actual transformation of the concept to the written code is poorly executed
- Nerds - Nerds write bad code very well. Nerds become obsessed with particular techniques and will use that techniqu whether it is relevant or not. However their attention to detail means that the code is well executed
Looks like you, like me, are a hippie under these definitions.init 11 - for when you need that edge.
To have enough spare time to do all the stuff people suggest here. Being married with a family, between commuting, working, doing chores, keeping wife happy, bring up children etc. I get maybe 30mins to an hour a week to myself and then I spend that working on website I sort of inherited after the previous editor bowed out. My commute could be used I guess to do a bit but that's the only time I get to listen to the news etc. on podcasts.
I can't even imagine having time to learn a language or play with programming for the sake of it.
To all those who have the time for this, enjoy it while you can and appreciate it.
I want a list of atrocities done in your name - Recoil
- So far, every time I have changed jobs, I've had to work hard to adapt to the new environment. New environments will keep you on your toes on different technologies, introducing you to new concepts which probably apply to various platforms. Once you've seen Oracle, MySQL, PostgreSQL and SQLServer, you'll likely know how to handle databases. Once you've seen PHP, JSP, ASP and CGI Perl scripts, you'll probably be familiar with the underlying concepts of server-side web programming. See a few flavors of everything and you'll readily adapt to new environments.
- It's not just about learning new programming languages and platforms. Perhaps to you "The next level" means fewer bugs. Do you already consistently write unit tests? Document requirements? Perform regression testing? Have your code tested by collegue programmers? What about code reviews/code reading? Is your code maintainable? Readable? User-friendly? Well-documented? Bug free? How can you (automatically) prevent these bugs next time? How familiar are you with the infrastructure of your programming environment (version control, build servers, network, etc?)
- Get familiar with 'new stuff'. I first heard about "Correctness by construction" here on Slashdot. Follow the white rabbit and find out what Spark Ada has to do with this.
- Learn to do things by yourself, even just as hobby project. Although nowadays it is relatively useless to write your own file compressor/database engine/scripting language/GUI framework/chat program/network protocol/file system/operating system, doing so will give you massive insight in how these work in general.
- Find someone with whom you can discuss better ways to do things. You will pull each other up. Show your code to each other and discuss improvements. Keep in mind that other programmers sometimes have an opposing view from yours. This doesn't mean that one is right and the other is wrong. (Example: What is better, a micro-kernel or a monolithic kernel? Answer: The truth is probably somewhere between those extremes.) The importance is in understanding the shades of gray between the black and white.
- If you want to learn, first you must get rid of the strong ego that most programmers build up over the years. Most programmers with a strong ego don't deserve their arrogance anyway.
Visit http://ringbreak.dnd.utwente.nl/~mrjb/growingbettersoftware to download your free copy of the book
Someone calling 'Java Web Programming' boring and PHP a fad. [sarcasm]Gee wizz, what kind of person could that be?[/sarcasm]
1) Neither Java or Webprogramming or both together are boring. It's jobs and projects that can be boring. If it isn't your thing, don't do it. And if the webstuff your doing in Java actually *is* boring, you might want to consider switching your framework? The current, somewhat justified hype is Rails but I'd actually suggest Symfony. Which, in second instance. is a PHP framework.
2) Sorry to be raining on your parade, but you're talking out of your ass. PHP isn't a fad. It was an Open Source SSI template solution that scratched an itch ten years back that could be solved satisfactory with Perl alone. Now it has grown to number two in the server side game, moping the floor with Cold Fusion, ASP and a few failed, sad and sorry attempts at consistent Java webframe projects. It's easy to learn, has by far the largest amount of very mature and successfull OSS webprojects and scares the living piss out of BEA, Intersystems and the occasional MS web plattform division.
PHP is a descendant of Perl and thus simularly crazy, no doubt - but calling it a fad puts you in the classic position of an anti-social, they're-all-holding-me-back Lisp/Ocaml/Eifel/[fill in rare academic PL here] crack that's actually best off *not* doing any stuff that requires frequent team interaction, such as - believe it or not - web projects. Ever considered doing exotic science stuff on large supercomputers or bio-IT or so? Chances are you'll feel like a bug in a rug in those fields.
Real world programming is about learning to cope with the restrictions of the real world, called load distribution, wacky and stone-age database concepts (you call PHP a fad but don't lose a word on SQL - how am I supposed to take your opinion for granted?), inconsistent and/or non-existing developement pipelines in dire need of updating, shoestring budgets and the occasional boss/client poping in and overthrowing everything. Programming and IT is about helping the people along, raising your boss/client to be aware of the needs of solid IT and it's resulting advantages and, in the end - believe it or not - acually delivering marketable results. All together makes up the skill of a good programmer. Pick your technology - whatever it may be it doesn't matter, only OSS may be a prerequisite - and get on with becoming one.
That's 2 cents from a client- and server-side web developer.
We suffer more in our imagination than in reality. - Seneca
Oh God!!!! That's ME!!!!! Why didn't anybody tell me this SOONER!!!! I feel so ASHAMED!!!! I need to re-program my Segway to lead me off of the edge of a bridge. I think I'll use a variant of the Medial Axis Transform of the city model to determine best path.
For about a year I had "The C++ Programming Language" book by Stroustrup, but only used it for reference. Then when I had some free time, I got the idea of doing the problems in the end of each chapter. Not just the easy or hard problems... all of them.
;)
What I found out was a lot of problems that I thought were trivial, weren't. It really forced me to push ahead, learn STL and the Zen of pointers. The few times I got stuck, I'd send an e-mail to a few other geeky developers (like me) on my work team the next day at lunch, and had a good time trying to solve what appeared to be a simple problem.
I found that at the end of a few weeks of going through the first few chapters, I just "knew" STL and C++ that much better.
So my recommendation:
1. Find a good book that ranked well in your area of interest
2. Be sure the book has a set of solve-your-own problems at the end of them
3. Solve them
Rather than typing two pages of code, it's only half a page(big deal).
Umm... elegance is not measured by terseness. It's measured primarily by clarity, ease of maintenance, ease of extension, ease of code reuse, and probably many other factors. What you describe is "clever" code, but it's not necessarily elegant.
BTW, as an aside, writing clean, elegant code rarely pays off in the short term. However, 6 months or a year down the line (or, better yet 10 years), well written, elegant code will almost always pay off in spades.
Heck, 3 months down the line in my experience. And it always pays off. Even the first time. Try going back over your last project to fix those bugs. Yep - much easier usually with "elegant" code.
The cesspool just got a check and balance.
Not having had the advantage of a formal education (I have a GED and otherwise I am self taught) I've had to resort to, in some cases, drastic means of career as well as technical information acquisition. I have found the following to be consistently true.
1. You are rarely given additional responsibility (i.e. new projects, new technologies, "hard" stuff) at a job without first proving that you can do it. This usually involves doing things that "aren't my job" without getting paid for it for a certain amount of time and then being your own advocate after the fact. No one deserves anything on their own word. Find new things going on at work and put yourself square in the middle of it. Nothing interesting going on? Start analyzing the development process and environment and propose ways of making it better (and ofter to execute said plan).
2. Read. A lot. I highly recommend O'Reilly's Safari Bookshelf thingie. Some people don't like to read on line and prefer "real" books. I think that's cool, but you can't let that be a reason why you don't read. If you can't afford to buy all the new tech books you want to read, get a library card. Live in some strange place with no libraries? Find a way. You will if you want it.
3. Read non-technical articles and resources about the development process, software design and architecture, intergration methods. You know, "sciencey" type stuff. I find that I like certain authors more than others. For instance, Martin Fowler (http://www.martinfowler.com/) is the author of many excellent books and is known for his work in design patterns and architecture. If you read nothing else, read his work. Remember there's a much bigger world than writing guest book "scripts" 10,000 times (and thank insert-deity-here that's true).
4. Talk to other people. Anyone. Everyone. Project managers, developers, system administrators, architects, analysts, QA folk, telco employees, and anyone else that will give you the time of day. Learn what they do, how they do it, why they do it that way, and how it effects what you do and why. You'll have a much better understanding of distributed computing if you understand network and security principals and how they apply (and you might just not open up yet another SQL inject bug because of it).
5. Commit yourself to improving your craft by practicing it. Constantly. I find that being involved in open source development is 100% free peer reviewed experiance. Additionally, the open source work I've done in the past has won me a job or two. You never know when you might meet someone important to advancing your life.
6. Consider everyone you meet a student who may benefit from you, but more importantly, a teacher no matter how much smarter you think you are. Discuss, debate, learn, integrate new knowledge, repeat.
7. Find a mentor. Someone willing to take you under their wing (whether they know it or not) and soak information from them like a sponge. Don't know one? That's why I said *find* one. Very few people learn things themselves. Most people are taught by others, if by written or spoken word, code, IRC, or otherwise. I can't stress the mentor thing enough. Find two. Three is better. Find mentors that don't agree with one another and compare ideas. Learn from everyone.
This is what has worked for me. I dropped out of high school, got a GED ("good enough diploma"), and got really lucky in meeting the people I did. I do software architecture and design for a living in addition to mentoring and "grooming" developers. I learn more from them in a single day than I learned from any book (give or take).
Good luck. If you're trying to figure out why you aren't where you want to be or why you haven't attained what you want, you're already a step ahead of everyone else. You'll be fine.