Where to find and learn about COTS solutions to programming problems? - java

I'm a senior java programmer and I'm used to building solutions from scratch. More often, though, I'm hearing people -- managers, clients, and other programmers -- suggesting we look for a COTS (Commerical Off The Shelf) solution.
Thing is, I know about programming, but I don't know about what COTS solutions are available or applicable to what I'm doing.
My question is, how should I best go about finding "COTS" solutions? Are there communities or a websites that focuses specifically on examining "COTS" solutions for programmers, or is it just like anything else, you google for existing products and hope to find a software application that does what you need?
Any help or suggestions are greatly appreciated!
Thanks,
Rob

One of the things I can say for sure about using a COTS product is you must be given access to the API and documentation. Far to often people run into the issue of paying X for a package and then not utilizing it properly. The other way to go is open source, as it is free and you can modify it as you see fit. Generally you will need to google up the specifics of what you want and you can find side-by-side comparisons for similar products, these however should be taken with a grain of salt. Take the list of products and set up test beds in your environment to see which works best with your current tools and programs and go from there. Vendors often give 30-60 day free trials of their software for this reason.

Related

Practice your micro-architectural skills [closed]

Closed. This question is opinion-based. It is not currently accepting answers.
Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
Closed 9 years ago.
Improve this question
I've googled a lot and can't find what I look for.
I look for some architecture practice. I mean there are a lot of books about Design Patterns, but I want something like analysis of common mistakes in architecture of EE applications. All I've found - antipatterns like string concatenation or something else that can be found with help of FindBug or Sonar.
How I figure it out:
Book with next steps: task definition, wrong decision, why it is bad, right decision.
Educational resources. I heard there are such resources for testers. Some applications are opened for testing and each who want to learn testing can test it; and after some period discuss own result with other people or see the percent of bugs he has found.
Maybe other ideas?
Why I think Design Pattern books are not suitable for me:
A developer may know many design patterns from such books, but can be incapable of selecting the correct one for the specific situation. IMHO, this is because these books don't give you any practice, and fail to educate the reader as to which design pattern(s) should be applied to any situation. Those books just get you a ready solution.
EDIT:
There aren't any answers any more. So I want to expand my question:
I believe, no I'm certain that exist courses dedicated to improve architecture skills, show the common mistakes in designing of web applications and so on. Also I know that there are a lot of conferences linked with this subject.
Advice me where should I look for them, please.
Holub on Patterns is a fresh and interesting perspective on design patterns.
Lots of code. Lots of pro and cons, very hands-on and practical. I learn something new every time I re-read it.
It has been my go-to book as the "next step after GoF and Head-First Design Patterns". I love it, and it has been very well recieved by the ones who have tried it.
Can I assume that you know how to create independent objects using Dependency Injection? If not, this would be an excellent are in which to cultivate reuse and create a more robust architecture. Using DI would be an excellent way to re-architect an existing solution. (Contrast that with much evolved code, which becomes brittle because of interdependency.)
While you're not looking toward Design Pattern books, I'd ask you to glance at Refactoring to Patterns by J. Kerievsky.
Kerievsky takes you through some real-life refactorings which have titles like "Move Creation Knowledge to Factory." (It's "real-life" in that he uses actual code, not a contrived example.)
Finally, I have been encouraged in our recent use of Spring Integration as an Enterprise Integration Pattern. If you architect and implement even a modest project in Spring Integration, you'll get quite a lot of experience with both DI and EIP.
If you're writing enterprise applications, I'd recommend Patterns of of Enterprise Application Architecture when you're done with the basic design patterns.
It was written about ten years ago and some of the more modern things about how to shard tons of big data across cheap servers you will not find in there. The cloud did not exist when it was written. But it seriously discusses a lot of things that you won't find discussed elsewhere, and coins names / patterns for elemental building blocks of applications. I'd call it a classic rather than old.
See http://www.martinfowler.com/eaaCatalog/ for an index of the patterns that are discussed.
In my experience, the role of an architect is defined differently for different companies and often has less to do with code structure and patterns and more to do with your business requirements and practices. Employers seem to be more interested in what systems you might integrate into your solution or how you expect to interact with varous customers under conditions imposed by your company.
Correctly using a DI framework or design patern is something ever programmer should be able to without specific guidence from an architect, but researching and choosing which DI framework to use that might best fit your task is something an Architect might do.
They also tend to do more advanced impelementations--One of the better architects I worked with implemented the more difficult parts of our system, he wrote a custom Java classloader that loaded classes from a database and designed how it interacted with a GUI builder he designed so our customers could edit a GUI with Drag and Drop and we would save a .class file into the DB so it could instantly be loaded by all the client machines hooked to that server.
Some companies have different definitions than others--a company I worked with that did set-top cable box software had some architects that hardly programmed or had anything to do with software design, they were responsible for things like decomposing communication protocols and interacting with customers to help understand their problems (I viewed this more as Analyst work than Architect, but it was much more technical than most Analyst work I've encountered)
I guess I'm saying that an awful lot depends on the company you are working with. I suggest you go to your manager (or an existing Architect) and tell him you are interested in such a path and ask how you should progress.
When asked pretty much this question, one of the Architects I've worked with said that it's something you are always working at--you don't study up and finish, keeping up to date all the time on as much as you can is your new job--Where others might read a book or play a video game, you should be reading articles about software design, installing and playing with new software languages/tools/libraries and learning more about the specifics of your business.
In my views what I think going through the Class Diagrams of the Design pattern will help you a lot.
What more i will suggest is to take a brief of the Book "Head First Design Patterns". As per my experience this book has some very good example related to every Patterns which will help you in the pattern selection.
As per the selection of Design Pattern is concerned you can develop it by implementing more and more pattern in different scenario.
Take a look at Adam Bien's book
Real world java EE 6 Patterns
You can download an introduction based on this book at java.net
Real world java EE Patterns (pdf)
The first step is learning general good practices for developing applications. Knowing design patterns is very useful as it is a type of a language, so if you call something a "Controller" or "Request/Response" that automatically tells other developers the patterns you are applying and how to use it/work with it. Also, large software is typically built using them, so you have to know design patterns. Doesn't mean you need to squeeze every single one into every application, just saves you the trouble of solving problems others have already solved. As far as best practices at code level, Sonar is a good code analysis tool that taught me tons of do's and don't's.
Second, you need to narrow down the context and determine what types of applications are you planning on architecting. For example, web applications have different architecture from embedded applications, if you specialize in one you don't necessarily need to know all the ins and outs of the other.
Third, read up on Enterprise Integration Patterns.
Fourth, do hands on work with Apache Camel. It's a Java enterprise integration framework, great documentation and really easy to get up and running.
To me design patterns look like solutions to isolated problems. In real practice we have to deal with combinations of problems, which are highly dependent. I have never seen any pattern used purely. I can recommend one book which gives a wider view of software architecture: Domain-Driven Design: Tackling Complexity in the Heart of Software. It says how to approach to software design, instead of giving a set of common tools. With some examples it explains how to solve a set of problems in combination.
One more book gives an explanation on how to design classes and their collaboration: Interface Oriented Design: With Patterns. To write good understandable and maintainable code. It explains a lower level approaches rather then DDD.
My two cents :)
I agree with your observation that simply learning design pattern is of little consequence. A typical thing which generally occurs after learning design patterns is that the developer tries to map the a ready made solution (pattern) to a problem which is not the right way and will create more problems than what it solves.
IMHO, being an architect is more a matter of experience than academics. An architect is at core a Problem Solver or Solution Provider. By problems, I mean the large scale design problem and not the day today programming problems.
The problems could be from whether to use OR mapping tool or not to larger and more profound problems like whether to go for SOA or not and likewise. Its not about WHAT to do but HOW to do.
These things are a matter of experience. A problem can be solved by thousand different ways but while designing a system, due consideration should given to technical feasibility, performance, scalability, deployment, maintenance, extensiblility and many such non-functional requirements. Now unless you have been-there-done-that, its difficult get hold of these things which are very vital for today's software system .
Nobody can deny the importance of books(apologies for not introducing to new books as people here have already suggested wonderful books). They are written by very intelligent, sharp and most important experienced, people. I view this as a way of sharing once's experience and view point and they help you in chalking your path.
Apart from books, the other very important way to understand or learn about system design is ability to dissect the existing systems. For example, you might want to explore how a typical web server like Tomcat works or a DI framework like Spring works. Open source makes these things possible.
The best single way to be a great software architect, developer, or programmer is to work.
Get the basics down, and then work on something - especially something you are interested in. Hard work will pay dividends in the form of experience.
Surround yourself with people smarter than you, and listen to what they have to say. Trust that their experiences can help lead you into a better understanding.
Wisdom is not something that can be bought with a $50 book, or even a $100K college degree. Software craftmanship is something that you must earn.
If you have free time, working on a popular and successful open source project will help you gain great experience.

Intelligent Product Recommendation

I would like to ask something about the implementation of Intelligent Product Recommendation
As I need to build an online shopping system using JSP and Mysql, I want to implement a function,
which can automatically recommend some related products when the user checks for one product details.
However, I did not have any learning experience for Artificial Intelligence.
There are too many resources on the Internet but I don't know which are good for learning.
Therefore, would anyone suggest some useful websites for studying such type of programming skill(that is, AI).
Thanks very much!
You need to implement "recommender system".
Wikipedia:
http://en.wikipedia.org/wiki/Recommender_system
Very good resource, from there you can go to the explanations of recommender algorithms and their implementations.
In your case, I believe that best algorithm will be item-to-item collaborative filtering (it is used by Amazon, for example).
This book will definitely help you:
"Algorithms of the Intelligent Web"
It has some cool explanations of how it works and how you can implement that.
If you havrn't AI skills, you should use ready to use software, I would recommend open source Taste(http://taste.sourceforge.net/) Don't be confused with mahhot project, it is not required hadoop cluster if you data is not very big (gigabites)

strategies for learning complex software packages

I am a fairly novice Java programmer and I am currently working on a project to extend a piece of software that has been developed over a few years.
So it has pretty big code base and the previous developers knew it well, so extending it is not going to be easy without a thorough understanding of the structure and function.
1) I had begun by trying to tackle small parts of the system and document them with mindmap. (particularly I am trying to document the interactions with external systems)
2) I have the book "code complete", which I am working through.
3) I have pointed some tools like "tattletale" at the code to get some diagrams of dependency relationships.
What other strategies should I employ, should I focus on one particular aspect?
10 Start small.
20 Break things.
30 Then fix what you broke.
40 Goto 20
Maybe you could try to model the problem the program is meant to solve. If you have a clear understanding of the problem and limitations imposed on the solution, then it should be easier to understand the program itself. I am just guessing here, as I do not know what sort of program it is.
It is important for you to find a good coach on the project. Go for a nice guy, who knows the system and who likes to answer your questions.
Also have the architect explain you the system. If it is a good one he can point you to the important parts and point you away from the parts you do not need to know (yet).
Then try picking up small issues. Even stupid error messages and go from there. In a few weeks you should be able to grasp the basics of the system.
Good luck!

If management decided opensource projects could fulfill business requirements. Would you (Java Developer) learn PHP? [closed]

Closed. This question is opinion-based. It is not currently accepting answers.
Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
Closed 9 years ago.
Improve this question
I would like to say upfront that i am not a programmer. I'm 1 of 3 partners in a small start up. Two of us have a business and sales background, whilst the third guy is a very experienced Java Programmer/engineer (and a good friend).
As with most start ups we believe we'll be the next big website. We have found a opportunity that the "Long Tail" really describes well. By this i mean a product range that isn't currently being tapped into online. As with Amazon, our model is about offering every available product within the niche. Through the availability of everything outside the fast selling products, we hope to become best website for the niche.
We have placed a lot of focus on building the business/technology system that allows us to build our inventory information very quickly. This was because we knew that the size of our inventory would make or break our usefulness to end users.
So now i come to the problem that prompted me to seek your help.... (please help)... :)
In my (non-technical business) mind, we now have the ability to build our inventory quickly. This is just the start though, as a business we also need the following solutions before making money:
A shopping cart application to
allow buyers to search our inventory,
communicate with our business and
make orders etc.
A CRM application would then
allow the effective management
of customers and orders.
I found my way to Magento and SugarCRM both of which appear to be very impressive. The idea being to use Magento for the buyers (search,buy,interact etc) and Sugar for our staff (order processing, customer service etc).
In my mind the long term rewards of being able to update these core applications from the communities, would far outweigh the steep learning curve. Not to mention the time/money that would be required to even attempt to catch up with what already is stable and tested....
My friend and business partner is unwilling to consider anything in PHP and to a large degree opensource. He's of the belief it would be best to start from scratch.
From a language agnostic business person (non-programmer) - any opinions or advise on our situation would be much appreciated...
I'm keen to find a way of us unlocking horns, either way... I just struggle to see any strong value in Re-inventing the wheel....
Thanks in advance,
Guy
Thanks for the replies so far and the link, i'll go there in a minute. Here's some answers:
Our stock is currently held across 30+ different branches. Which means that we'd need a way for each branch to sign in and manage their own customers.
From our operational point of view, these seem to be the key challenges outside standard :
1) Our business has regions and each region has branches. In order for us to focus the various management levels of the business, it would be ideal if each management level could see the business relevant to them. For example National manager (can see everything), Regional manager (can see all branches in his region), Branch manager (can see everything for his branch with certain admin rights) and Customer service (can see everything in their branch with minimal rights). This is the only way we can have one umbrella site, which can be serviced by staff in branches nationally.
2) Over and above managing orders, it also makes sense that the messages are managed centrally through the application. This way any member of staff can easily see the past history with the customer and assist. I'm thinking that the questions would almost always come in through "Ask a question about this product" link, so incoming messages could be routed to the branch who has the part. If it's aftersales, then the branch who sold it. For general questions through contact us, we'll allocate a member of staff at head office.
3) I think it would be appropriate to show buyers upfront on the product page which branch has the part and the branch information.
4) Total inventory size is currently over 300,000 products. The business plan is to rapidly increase this to 10 times that figure.
5) The products are spare parts. Therefore the buyer would need to search by the orignal product that the parts fits... Each part can often be used on various products.
The answer to this is very difficult, largely due to the fact that not all of your requirements are present. What size is your business going to be? Do you plan on expanding quickly? Do you have specialized requirements? What are those requirements? Answers to questions such as these need to be hashed out.
Now, I need to make a few quick points. There can be a tendency for developers to choose a technology they are comfortable with while disregarding the better choice. There is also a tendency for developers to also want to develope from scratch. This said, if your developer is truelly experienced he will have a good idea of what to use, what to resuse, and what to develope from scratch. You should also take note that this is not an all or nothing sort of situation, and you can blend opensource and homebrew.
My suggestion to you: If you are none technical and your startup is just a few people, this means your one Technologist is essentially your Chief Technology Officer. You need to allow him freedom of choosing technologies and developing his technical plans. This doesn't mean you can't be part of the planning process, but picking specfic technologies is in the realm of his expertise, and you should give him room to move. There could be very good reasons for not using PHP. If you can't trust your CTO to make these decisions you need a new CTO. Edit: --Or you need to start trusting him.
Is your friend experienced at all with running a business?
If not, he may not realize the basic truth:
If something is your core competence, strategically, do it in-house. E.g. you posess the staff who can do it better AND cheaper (however you mesh the two) than competing solutions. E.g. if your friend has extensive experience developing such types of software, or has a working prototype already that fits your needs, or is Jon Skeet and can develop a CRM application fully born from his head between lunch and dinner.
If something is your marginal advantage, do it in-house. E.g. if your friend has ideas on features that would give you a leg up on competition AND can not be easily replicated by competitors. If he merely has a brilliant new widget for a web site that any half-competent developer can clone in 3 weeks, it's not worth it.
Otherwise, do NOT do it in-house. You will waste your businesses' resources on something that gives you no advantage over competitors.
This is not related, in any way shape or form, to PHP and open source.
If you can't develop a qualitatively better solution that will strategically (long term) outperform the opensource solution your competitors use, your software will be a marginal cost to the business, not marginal benefit.
Sadly, the only one who can answer the last question is the technical guy, and he may be, like all techies, biased towards homegrown stuff. So as someone in the other response said, you need to trust his judgement or get someone whose judgement you trust, friend or not.
Nut be sure the question he is answering is the right question -- the one in bold 2 paragraphs above
Hope this clarifies somewhat.
Is there anything about your business model that custom technology is a strategic advantage or core competency? Is there anything special about the products you are selling that require the web site to be any different than any of hundreds of different types of existing online ecommerce sites?
You haven't yet shown anything which would lead me to believe you need custom programming for anything.
This might not go down well with your Java programmer friend, but until you show some kind of differentiating need, wouldn't commercial-off-the-shelf (even hosted) systems meet your needs?
This kind of question might be better off at http://answers.onstartups.com/
After reading your further specifications - they are fairly complex but not that far outside other businesses, I think you need to do a thorough evaluation of the COTS products out there with your technologist with a completely open mind.
The "wheel" you're talking about isn't round. It's as lumpy and pointy and oddly shaped as your business requirements are. If your business requirements are the same as those of other Magento and Sugar CRM users, and will be for the next five years, then they may be great products for you. Then you just need to figure out how to fire your friend, who will not be the best person to maintain those applications.
Or you may need heavy customization, need or anticipate special features not already found in those applications, or want to continue working with your friend. If so, then perhaps you should defer to to your expert friend on technical, programming related decisions, while he leaves sales and financing decisions up to you.
I think some of the answers here are made under the assumption that open source development cannot be branched, it can. You can branch development from Magento, and add new concepts & modules specific to your business. Magneto in fact already has a system in place for doing this. Magento's weakest point is it is not well documented (but is your homebrew system really going to be documented better???)
Regarding #5 the spare parts search - shameless plug - part search extension for magento
Being able to understand, maintain, develop and have control over own technology is very much a business requirement and a very important one. And here you have to trust and respect the opinion of the most technologically experienced member of your team. Either this or look for a new partner.
It sounds as if you have a very ambitious business plan and you’ll need more than 3 persons to put it into life, perhaps you could hire some PHP or Java gurus? Sanitizing 300K+ product descriptions and entering them into the system is going to be a challenge on its own, in addition to setting up the system, failover, testing, customisation (even if you started off with a OSS product) etc.
Are you sure you’ve really got the necessary resource to go that big that quick and still achieve a service of satisfactory quality? Would your business plan still work at a much slower pace or does it rely on the ability to set up a massive operation very early to grab the land?
Another person who understands technology well on the board level could have been beneficial, since your friend needs to cover a lot of ground to set up all the systems necessary for trading and possibly could make use of some help.
Answering your question: PHP and Java are two different universes, and imposing a requirement of learning PHP on your friend will just make the enterprise even more technologically risky. And since your friend doesn't seem to be comfortable with the idea will simply not work.

How can I quickly improve my abilities as a programmer?

My question is broader than merely expanding language specific skills. I'm wondering what sort of advice anyone might offer to someone with a desire for knowledge, but a lack of direction. Feel free to skip down to the question.
Background: I've taken a single computer science course in java at my University, but i'm planning on majoring in Computer Science and Electrical Computer Engineering (ECE). My java class was quite rudimentary. We were provided with a framework and merely edited/created a few methods and classes to perform a simple task. We made a version of Breakout, and created an AI for a simple connect-four game. Although I'm somewhat familiar with big O notation, I haven't actually studied it in class (My next CS class covers this). In my introductory ECE course we also programmed BOE-Bots in PBASIC to compete in an obstacle course of sorts. As an engineering student, I was also introduced to matlab, although I've only used it for linear algebra homework. In summary, I don't have much programming background, but I've loved pretty much everything I've done so far, and I'm looking for ways to build a more valuable skill set.
Steps Taken: After paying more attention to the programming section of reddit, I found a link to Project Euler. This summer I've been hacking away at those problems (finished my 42nd solution yesterday), but I'm looking for some more direction. I've been reading blog entries and SO heavily. I'd like to learn something about php, and perhaps create a dynamic webpage, but fundamentally I want to do anything in my power do to improve myself and prepare for the working world.
Question: What would direction would you recommend for me? Should I learn a new language? Keep attacking Project Euler? Read some books on programming? Start a coding project(I wouldn't even know where to begin)? Wait until school? Learn about more fundamental programming principles?
I guess with all the paths available, I'm just a little overwhelmed, and I don't want to fall into a path that might be detrimental to my career opportunities. I'm also really bad at making decisions. Your advice would be greatly appreciated!
The word quickly worries me... I suggest you read Teach Yourself Programming in Ten Years - Why is everyone in such a rush?
~~ Peter Norvig
Forgive yourself if you're not setting the world on fire three weeks after sitting down at the keyboard... maybe you're destined to be a late bloomer?
;-)
Most everyone is suggesting doing more programming. Whilst that's obviously important, I think it's important to understand the environments that your programs work in.
I would investigate how operating system work (how they allocate resources for you, how they schedule programs and threads), how networks work (routing, TCP/UDP behaviours and limitations etc.), and some database theory.
I see a lot of junior programmers with great language knowledge, but beyond the sandbox of their program they don't have a clue how the computer/network enables their stuff to run.
Knowing something of the above will make you a better programmer in terms of how you write your programs, and how you understand how they'll work (and indeed, how to debug them or analyse their failures)
There is only one thing that can improve your skills as a programmer: Program.
Reading books about programming is akin to reading books about cycling. It's not going to turn you into a cyclist.
Program something that you'll use and have a vested interest in. Then just put your head down and do it - reading any supporting information as you go.
Programming skills are just a small part of what makes a successful programmer, IMHO. Being able to read specifications, ask questions and interact with other people to extract the information you need to program are very important too. Pay attention to your 'soft' skills, they will help you a lot in being a successful programmer in a commercial setting.
I'd reccomend you take a multi-pronged approach. Reading books can only take you so far, since they don't provide you with practical experience in developing an application from scratch. Programming is much more now about writing code; you have to be able to design applications, read documentation, and know how to solve the needs of a customer who doesn't know how to tell you what to write.
If you're still in college, try to find an internship with a development firm. You'll get access to people and resources who already have this experience. If you for some reason can't do an internship, find and make a friend who is a developer. The impact of having someone who knows what they're doing to bounce ideas off of is immeasurable.
In addition to surrounding yourself with people with knowledge, you should also take on writing an application all your own. Pick something that interests you, but at the same time try not to make it too complicated, you don't want to frustrate yourself by writing a boring application, or choosing something that has too steep of a learning curve. Remember that the application is at it's core, a tool to assist you in learning, so it's OK if it turns out to be less complex then you imagined, or if the code you're practicing doesn't apply within the scope of what you're trying to write.
You definitely need to write code in order to become a better programmer. If you don't have a particular idea for a program to write, pick an open-source program (ideally one that you use), contact them and find out what they need done; contribute something. Fix a bug, implement a feature... start small and work your way up. This will help you learn about working on a team, writing maintainable code, preventing problems, and working on useful tasks. Much of what people write while learning to program is just exercise code, and not actually useful or representative of anything realistic. That is why a real, useful program is the best thing to do.
I saw an interesting link for a site called CodeKata that might help you. The important thing to get your skills going quickly is to actually code for practical problems that you will be likely to encounter in any real job.
Besides picking an interesting project and implementing it from scratch, reading others' code can also be valuable in improving your skills. Scott Hanselman has a good series on reading code: Weekly Source Code
Since you already know the fundamentals of programming, and obviously have the desire to learn I would start a pet project.
Nothing has forced me to learn great deals about a technology, language or idea more than having a fairly challenging pet project to throw my self into.
I would recommend, like rein mentioned, picking a project you really have a true interest in. Other wise it will get boring pretty fast and you'll have no idea why you are working on it. I think it would be wise to make the project fairly non-trivial. I always found the less trivial a project I was working on, the more I learned and took away from it.
Also If you live near a college/university research labs on campus are pretty much always looking for summer interns to work on code in one shape or form. Some will even pay you. I did this for 4-5 years through high school and some university and it was a great learning experience.
Obviously participating in an open source project is a great way to gain experience at working with other developers. Check out stuff on github, sourceforge, bitbucket.
I'd only caution you to ask for help and bother the core developers of a project you are very interested in and you are going to stick with. Generally open source developers dedicated to there project are few and far between. Their time is really valuable to the community and to waste it on someone who is just going to fly by night and never be seen again is kind of a shame.
It sounds like you are writing programs happily, and are a decent java programmer. So writing more might not be your most productive way of learning new things.
As a result, I'd say learn a new language - knowing more than 1 always exposes you to new concepts. As a java programmer I'd suggest C/C++ as they've immensely popular but they fill areas that the 'managed high level' languages don't go, the low-level high-performance, to-the-metal applications. If you learn C# (for example) you'll find you're just doing a different dialect of java (roughly) and you won't learn too much.
If you don't like the idea of C/C++, get into a scripting language instead - bash, VBScript/WMI, or perl or python. they'll be sufficiently different to teach you some good stuff.
Or do both!
You already know how to program; in order to prepare yourself for a real life job, the most important thing is probably not how to program better, but to learn the things you'll have to do that aren't programming.
In your workplace, you most likely won't be asked to write line "fire and forget" programs, but work in a team on large applications. In order to do that effectively, you need to learn:
How to communicate effectively with analysts, customers, managers and your fellow programmers
How to plan and coordinate work: using source control systems and bug tracking systems, working with written specifications, following a development process - "software engineering"
Perhaps most importantly: get used to working with other people's code - third party libraries, frameworks, and of course colleagues' code.
This, too, can most effectively be learned through hands-on experience in a real project. For me, the big eye-opener was working in a group of about 10 students in an experimental project organized by university with some industry support. Perhaps you can find or organize something similar at your university? If it has a chair dealing with software engineering, they should be happy to do something like that if they aren't already. Failing that, joining an open source project is good too.
Write programs to automate things that you do manually on a daily basis.
Like, todo lists, keeping accounts, checking RSS feeds.. the list could be endless. If you do some business on the side, write some simple code to assist you in that.
The essence is: to improve your programming, do programing! :D
Contributing to open source projects has a surprisingly high impact on your ability to develop software, as opposed to the ability of writing code:
you get to work on code written by others, which is sometimes brilliant and sometimes abysmal;
collaborate within a geographically distributed team;
get introduced to team politics ( yay! );
understand what it means to have actual users.
to quote just a few. Some good places to look:
Codehaus
Sourceforge
Google code
Find out about best practices (for example training videos on windowsclient.net). Get any problem and solve it using database as input and database as output. Start over several times. That's as close as you can get to the real world scenario. Read books recommended by Joel.
Here's my multi-prong suggestion:
1) Big picture work - Look at various Software Development methodologies and see how when you program you follow one of these approaches. You did some Java work, was that web, windows application, console application, or something else? Learning a little about the other types may also prove useful
2) Medium picture work - Have you looked at Refactoring and Design Patterns? These can be very useful but may require a bit more coding experience to see how they can be useful.
3) Small picture work - Study various algorithms and understand various trade offs one can make in choosing various implementations of a data structure, e.g. linked lists vs. arrays. There is a big white book about Algorithms that some use when studying them.
My multi-advise:
Keep training, and write code. Participate in small open source project.
Read standard book (here is the Jeff's list)
Learn from your mistakes, or better from the mistakes of others by reading site like www.badprogramming.com
From 99 ways to become a better developer:
Program! and try to diversify your work as much as possible
Find a mentor
Be a mentor
Learn about the different aspect of software development other than code (business of software etc.)

Categories