Well I'll throw in my two cents. 

Before I go into what I would offer for response, I partially agree with data models. But I think it is more about understanding normal forms of data, efficiency in storage and general database design. And I do not buy into the idea that 10% knowledge will get you 90% of the way (not that anyone said that, I'm just adding it in before someone uses that argument). If someone is not going to take the time and learn at least 75% of what it takes to model data, then library computing is not for them unless they work in a library that doesn't use databases. And no, knowing 75% of everything about Solr does not count. To me, that's like putting on your resume that you know how to use Firefox.

I think these are the critical things anyone should develop professionally. 

- learn to write a solid spec
- do not deviate from the spec until after the spec is complete
- be able to meet the spec
- spend at least twice as much time planning as you do implementing
- write small parts, release them often
- do not leave out the human - computer interaction/usability
- don't corner yourself into your comfort zone
- learn to delegate, know when to ask for help
- documentation is equally as important as the final product
- take risks
- reinvent the wheel

Just starting out puts you at an advantage to learn how to write a good spec because you might not be able to complete an entire project. This will force you to put it into a meaningful narrative that another geek can follow. Imagine being in the situation of two people in a car, the drive is blindfolded and you are not but have to tell them where to drive strapped into the passenger seat without the ability to touch any of the controls. If you leave out a step, things may go bad.

Make sure the spec is solid, there will be plenty of things left out that can be approached in version 2. But more importantly, don't let the scope creep your project into something different than the original spec. You can modify it to do more after. Don't create things that are gigantic in scope but only partially complete in all aspects and the main reason you started isn't even completed.

Set goals/deadlines/milestones and meet them. If you can't meet them, learn why so the next time you write a better project plan with realistic timelines. Don't pad your timeline. Set a timeline you think you will meet and learn why you did it quicker or didn't meet it so next time you set a timeline that matches closely. When someone asks you how long to do X, you'll know from experience. If you don't set timelines, you'll never know how longs take and if you move into management, your staff will have a field day telling you how long things take.

I typically spend 60% of a project planning, 30% coding and 10% bug fixing/tweaking. Again, set goals. Some of the most important deadlines are in the 60% planning phase. Just because it's planning doesn't mean you don't need deadlines.

Do not dwell on perfection. Start with the benchmark, "it's good enough to release if it at least does _this_". Then release additional parts often. There's a number of reasons why, the three I latch onto are: it will keep you excited about the project, negative feedback can be taken in before it requires massive change to adjust and it will generally show a lot of people that you are making progress. 

Make your stuff usable. Don't create an app that requires some obscure method of doing things. Pretend you are a user and ask yourself, is that really the right number of mouse clicks? Will people even see that button I spent 9 hours in photoshop shading? Maybe I don't need a javascript alert box for every single notification. For usability I point to video games, specifically first person shooters. Imagine if firing the weapon required holding the left shift key and clicking the mouse on a tiny submit button in the upper left and you aimed the gun using the number keys 8, 4, 6 and 2. I'm no expert, but I know I'd never buy a game from that publisher again. My point is that people want to do what feels natural with as few clicks as possible. Your goal should be to design stuff that doesn't require instruction. If you have to explain too much and get defensive after explaining your form for 45 minutes to people who still don't get it, you totally failed at usability, learn from it. But consider usability a lot, why is the ignition on the right in your car? Why not control the gas pedal and brakes with your hands and steer with your feet?

Ok, I get it, the last time you took on the task you setup your database like _this_ and used _these_ PHP plugins and _here's_ my list of helper classes. It's ok to take a completely different approach, don't get into the habit of "cooking up recipes" and never deviating. Leave your comfort zone, try another language, don't stop learning. Believe it or not, PHP was not always around, people used to program in other things and got the same results. That would signal that PHP might not always be around or there may be better/newer things out there. You need to develop a knack for knowing what's a trend and what's a fad. I think this list helps with that a lot but develop instincts. 

Don't ask for help the day before your deadline. I promise that you knew you would not hit the deadline 25% of the way into it.If you catch it then and add more people to help, you may end up beating the deadline by 25%. If you wrote a good spec, they will be able to jump in and hit the ground running. Learning to delegate is not knowing which parts to hand off to someone else, it is being able to accept the end results they give even if they are not exactly how you would have done it. If they meet your spec and work, you delegated properly.

Documentation is king. If what you wrote is worthy of sharing, you must be able to document the install and within the code, explain what is going on where. Related to documentation, write good code. Use normal conventions and don't try and be cute. for(int i=0;i<20;i++), not for(int _myFirstIntegerVariable=0...Consider application lifecycle management but know when to care. You don't need to manage the life cycle of a form that takes user feedback and sticks it into a SQL table unless it is part of a larger framework that provides complex controls for the simple forms to use.

Take risks, it's ok to fail as long as you documented the whole thing. I've given entire presentation on "how not to code" something. 

If the wheel was never reinvented we would be driving cars that have rock wheels and require 20 gallons of gas to go a mile, possibly with steam engines. Take someone else's concept and make it better. That's an OK goal. It's better to join an existing project and make the project better but sometimes you have to do the whole thing yourself to give it meaning to which it may take on a life of its own, that's a great thing.

Two final opinions. 
1- Try to learn using the same tools and books as people around you. If you work somewhere that has a lot of people using Eclipse, learn to use Eclipse, if everyone uses Netbeans, use that. 
2- Talk to people who do what you want to be doing, just like you're doing now, don't stop.

Best of luck to you.

Michael Friscia
Manager, Digital Library & Programming Services
Yale University Library
(203) 432-1856

From: Code for Libraries [[log in to unmask]] on behalf of Anne Gresham [[log in to unmask]]
Sent: Monday, November 28, 2011 11:07 AM
To: [log in to unmask]
Subject: [CODE4LIB] Professional development advice?

Hi code4lib folks,

I'm in my final semester of library school and my first year as a baby
librarian. At school, I focused on systems and technology, and I'm currently
running a desktop and mobile site at work. I'm fine with HTML and CSS, and I
can fumble around in PHP, but I feel very under-prepared for the library web
developer career I want to have. I was wondering what skills/programming
languages/experience you think I should be seeking if I want to be able to
develop (good) interactive online resources/digital collections for library
patrons and/or staff.

Thanks for your help!

Anne Gresham
Reference Librarian
Springdale Public Library
479-750-8180 | [log in to unmask]