views:

1332

answers:

21

Hi All,

I am a newbie here. So please bear with me if this is a duplicate/very trivial Qn. I am not from a Computer Science background. But currently working in software testing. I would like move to software development. I know there is whole interesting areas outside there. But I am facing difficulty in choosing where to start? I have basic knowledge in C,C++ & Java. But all my learnings are restricted to minimal - syntaxes & simple programs. Sometimes it seems to me automation is very interesting, some times OS level programming, sometimes Game development, Ah! I am lost.

I have started lot of times with various books, online(openware) courses, but I will never finish any single subject, coz, even after going through half the lectures, it will be till with concepts/basics..I would not be able to produce any tangible results.

Will these seem to u guys logical steps:

1) Choose a language. For me Java/C++ be useful ones in my job too
2) Learn to the maximum details
3) Then what? Where can I get some real world examples to try? Can you suggest any forums, pls...

or

1) Learn concepts in detail like data structures, OS internals etc
2) Learn a language
3) But again, whats the tangible result?

Hope, my first Qn in this forum is not very awkward....

Thanks a lot in advance!,

An aspiring s/w developer

+8  A: 

Write a small program for your own benefit.


When I learn a new language, I have a habit of writing a small program when the class is over to help solidify the learning in my memory. My favorite is what I call 'dirsize'. Dirsize recursively traverses the directory structure and produces the sum of the sizes of all files below a given starting place. The starting place is usually hard coded at first. When it is working, it can be changed to use an argument to the program or to provide some user interface to select the starting directory.

A side benefit of programming 'dirsize' is you come to appreciate recursion and understand that a directory is not just a special type of file.

Kelly French
+1. When learning a new language/technology, I typically first read a book or equivalent, but then you really have to write your own code. Not just snippets, but something which works from end to end. First this is motivating because it's your project, and then, book examples have a way to look easy, but writing your own will bring up tons of small issues and questions and force you to dig and make sure you really got it.
Mathias
+22  A: 

Become the best tester on your team. Everytime you find a bug, instead of just reporting it, look in the code and figure out the fix as well. Report the bug and the fix together. Become better at finding the fixes than one or two of the developers and then ask your company for a transfer to the development team.

zac
Great answer, I would add, while you are doing this testing work, you can supplement that 'practical' work with some reading. I would suggest picking up a generic book on Design Patterns, something like the Head First Design Patterns book.
Sean
Fixing the bugs is good, but depending on the complexity of the system, maybe a little overly ambitious. I'd also suggest to track the solution right to completion as the developers check in the source code and learn from that what the solution was.
FrustratedWithFormsDesigner
Be sure to write code often. Create little projects for your self to help understand a piece of the language you are learning (XML, File IO, SQL, OO concepts) If you use them regularly for simple things they will be in practice when you need them. Try to write helper applications for your testing.
Jeremy E
excellent answer. i feel that when you're debugging the code and trying to fix it you learn a lot more about everything from design (how it should be) and why it didnt work. that way once you started coding yourself you can avoid some of the pitfalls you've encountered from debugging someone else's code.
centr0
I actually did just this to get my current position and I do not have a CS degree. However, you have to be careful. It is not technically your job to spend time fixing bugs, it is your job to find them and to provide steps for reproducing the problem. You could easily get in trouble doing this.
Ed Swangren
It's good, but only to a point. If the code research takes 5-10 minutes, not big deal. If the research takes 3 hours, it means the bug finding is delayed 3 hours. Technically speaking it's not the testers job to find bugs, and a manager in a high process company will get concerned that the tester doesn't know how to prioritorize time.
bethlakshmi
Wow and how should tester get the source? you think he should try to reverse engineering? but what if it web app? should he bribe someone? i never worked at place where anybody could just get source code.
01
+1  A: 

I suggest you get a real goal, like an open source project to join, or even a small project of your own, and then just learn what you need in order to do it. It sounds like you get bored from learning for the sake of learning, so learn for the sake of doing.

If you choose an open source project, start with a small one (1-3 developers, not longer than 2 years around) because those tend to be simpler, and will allow you to get up to speed faster.

Ofri Raviv
+13  A: 

Learning basic computer-science concepts, as opposed to learning to program in an actual language are not mutually exclusive activities. They are really parallel activities. In my opinion, you really should start by learning general computer-science concepts such as loops, conditionals, the basics of structured programming, data structures, algorithmic complexity, etc.. All of these concepts help to create a foundation of knowledge that you can apply practically in any computer programming language, to produce tangible results.

Additionally, it's difficult to learn these concepts without doing actual programming, and so picking up an actual programming language will go hand in hand with basic computer science concepts.

As for what actual programming language you should learn, asking that on the Internet is almost akin to asking what religion you should convert to. But if you have your mind set on Java or C++, that's as good a place to start as any.

Charles Salvia
Agreed, Computer Science is much more about concepts than it is learning a bunch of languages, but the process does go hand in hand.
Dave
+1  A: 

Start by reading "How to Become a Hacker" by Eric S. Raymond and all the other articles he refers to within the essay.

Pierre-Antoine LaFayette
+2  A: 

Pick a project that seems interesting to you, also of practical value. Start with something small. What hobbies/interests do you have outside of work? See if you can come up with a small project related to that (hard to be more specific without knowing more). Once you are comfortable with programming in that area, talk to your manager about switching to the dev teams.

FrustratedWithFormsDesigner
+4  A: 

I know a lot of people in your position that want to break free from all the basics and get right into programming. Just be patient, it will come with time. Do not be discouraged about completly finishing a book, I've got plenty of books I usually never finish. You always have plenty of time finishing books. In fact, just this week I finished a book I purchased probably 8 years ago. I'm a .net developer but back in college I loved C++ (still do, although my work @ work is not in C++). So I finally completly completed Effective C++ by Myers (Excellent book by the way).

Anyhow back to the topic at hand. I like you want to learn every frigging language there is out there. At one point I was juggling CSS, Javascript, C#, VB.net, PHP, mySQL, and SQL Server all at once. Don't do this it is just too much knowledge for one person at a single point of time. Pick up 1 maybe 2 programming languages (C#, VB.net), then combine that with some presentation / markup language (CSS / HTML). Stick to the basics for the time being and begin a small project that may be beneficial to you.

Here are some ideas:

  • An Issue Management System
  • A banking application that will store savings / checking information
  • A small lightweight client application that stores your favorite websites (like the favorites inside of your browser)

When you start seeing things become a bit more complex break up the tasks into smaller pieces. Perfect your code until you think all bugs are completly gone and the application runs as smooth as you'd like it too. Once you have done a full blown application move into a phase II by adding some more advanced features.

Slowly but surely you will begin to appreciate what you do and quite honestly if you work hard at it (even outside of work) then your managers will notice it. It is not a 5 minute task, it may even take years but you will eventually grasp a few languages and be able to program nice applications.

Remember just try to keep it simple (KISS principle), do not overwhelm yourself by buying books, and DO NOT COMPARE YOURSELF WITH OTHER PROGRAMMERS. Everyone is different and it takes patience and practice to become better at it.

Good luck and don't give up!

JonH
Hear! hear! to not learning a dozen languages/APIs/etc at the same time. I lost a job once due to climbing too many learning curves at once.
DarenW
+1  A: 

Disclaimer: my answer is not relevant to your actual question title, but about one aspect in your description, saying that you have a hard time going through books (if you're serious about making this a career, then my advice would be to go to school). Anyway:

  • Program. Program again. Then program some more. Unless you apply things you read in a book you'll either not remember them or not know how to apply them.

  • Start low. Start with simple programs. Fun things, like code-golf questions on stackoverflow, or EulerProject puzzles, are a great way to learn the fundamentals of a language.

  • This is more subjective, but learn to use an IDE and create a GUI program that you can run by double cliking it. For me personnally, it was a big step forward, it felt more of a "real" program then a console app, and made me more confident.

JRL
+6  A: 

Sometimes it seems to me automation is very interesting, some times OS level programming, sometimes Game development, Ah! I am lost.

Oh, if I had a nickel for every time I heard an aspiring programmer say "I WANT TO WRITE GAMES!", I'd have 953 nickels.

1) Learn concepts in detail like data structures, OS internals etc 2) Learn a language 3) But again, whats the tangible result?

You're asking about lots of different subjects here:

Data structures: I've interviewed lots of people, and I find 95% of them know absolute squat about data structures. As in, they can't write a linked list or hash table from scratch. It doesn't stop these people from getting jobs. If all you do is write line-of-business apps and websites, you'll probably never use any data structures outside of arrays, linked lists, and hash tables.

But, if you ever want to do something "cool", like write a compiler, or be the best programmer on your team, you should definitely pick up some books.

OS internals: not likely to be relevant in your first job.

Choosing a language: Its best to learn something popular. C# and Java aren't the fanciest languages, but entry-level jobs are plentiful.

Tangible results: If you can write an app which connects to a database, shows data to users in a grid, and saves back to a database, you already have 90% of the skills required for any entry-level programming job. Once you get that down, the next step is learning about design patterns, and learning how to write nice looking, maintainable code.


So, now you want to start a career. Normally, I recommend having a good attitude: make sure you really like writing code, and you aren't jumping into this field because it pays well.

Alright, so you have the right attitude. Before applying, learn at least one language, maybe Java or C#. If you find a pet project, like writing a blog or messageboard engine, that makes learning a new language easy.

Finally, scour through job sites (Monster, Career Link, etc) looking for entry-level programming positions. Odds are, they won't pay well, but once you get one year of work experience, you can move on to much more awesome things.

Good luck!

Juliet
It's important to *understand* data structures, even if you can't implement them yourself. Implementing something like an AVL-tree from scratch is hard, even for experienced programmers. But it's important for every programmer to at least *understand* the benefits/trade-offs provided by each data structure, so that, e.g. you know when to use a list as opposed to an array, or a tree as opposed to a hash-table. This knowledge will lead to better programs, even if you never actually implement a data structure in your entire career.
Charles Salvia
Want to have 954 nickels? =)
DivineWolfwood
A: 

A book that is still relavant is Code Complete by Steve McConnell. This book takes you from beginner to intermediate and explains the rationale behind much of the fundumentals of Software Development. Another book to read is Refactoring by Martin Fowler this will help you simplify your code and make it possible to tackle bigger problems. Refactoring is also the tool that will lead you to elagant code that you can be proud of and others will admire. Then a dose of Design Patterns wouldn't hurt. Design Patterns will help you avoid reinventing the wheel when a perfectly good generic solution already exists that has been proven to work by others. You will need to decide at some point whether you want to work on Front End (GUI / Web Site) or Back End (Web Service / Console Apps) it is good to know both but specializing really helps. As with any skill it really comes down to practice, practice, practice.

Good Luck with your career!

Jeremy E
+2  A: 

If you are a tester, I would say that you should write some of your own tests. Automate as much of your job as possible. If you do this, you will inevitably get better results than your fellow testers. This will then give you some more time to look at the code, identify the bugs, and then you can not only submit a bug, but you can submit a fix as well. This should at least get you noticed.

Go buy some books on the language that is mainly used at your company and learn as much as you can. It sounds to me like you are just a bit too impatient. Results take time and practice. Read the books and work through all the examples and problems, you'll get there.

Molex
+1, this was exactly what I was thinking. By doing automation, the OP will improve their coding skills (in writing automated test scripts in a programming language) while maintaining your previous position/standing in your company.
sheepsimulator
A: 

I entered university in 2001 just before the dotcom burst.

A lot of people in the Computer Science program was in it for the money. They didn't make it through the five year program.

The lesson is to nnjoy coding for fun and not for money.

Yada
A: 

It sounds like you're driven by tangible results, and there's no better place to learn-while-doing than on an open source project. Go to github.com, or sourceforge.net, and search around for projects (young is better). I guarantee that no matter what your interest is (games, utilities, operating systems) you'll find tons of projects that will be a good fit.

Most important thing to do when starting an endeavor like this is to become a USER of the project first. That will let you know what it does, what it needs, where the problems are, and most important for you (it sounds like), you'll get to experience the result of your work.

Then, when applying for jobs, you can reference these projects on your resume and during interviews, so the really good shops (the ones you want to work for), will actually get to check out some real code you've written for a real project. IMHO, that's the best way to get your foot in the door.

Ethan Vizitei
A: 

Don't go into any career unless it's something you enjoy. I am successful in the software engineer field because I've been working with code and making web sites since I was in my early teens.

That being said, if this is something you are passionate about it is generally best that you get a 4 year degree. Online college or not you need a degree, I've currently been searching the market out there for a new job and it's stunning the number of employers who require bachelor degrees just to even consider a candidate.

It is also invaluable to have experience, which means doing what many other people have mentioned. Finding projects you enjoy working on and doing them in your spare time. This field can be incredibly profitable if you enjoy what you do and put effort into it.

Mmerrell
A: 

I think pretty much everyone here has good answers, but I wanted to write up something tangential to your topic: actually transitioning from QA to development.

Within your own company, this could be difficult depending upon how mgmt works. I would express your intent to change gears to the "right people" at some point, perhaps your team lead/supervisor, the person that deals with long(er) term decision making. If they see your interest, and you can demonstrate skill in doing programming, they may be able to help you transition to a new, similar role in development.

sheepsimulator
+4  A: 

An initial question from my view is where in the world are you? If you were in the US or Canada, I'd suggest getting a Bachelor's degree in Computer Science, Mathematics or Engineering as this is a common requirement that can also provide some good foundational pieces to becoming a developer. In other parts of the world, I'm not sure what the equivalent education would be.

Another point is to consider reading about various development methodologies like Scrum, Agile, Waterfall and the SDLC.

Lastly, there are many other questions here that may have useful answers:

A few other questions where I'd suggest looking at some of the top answers and see if you can find a common theme:

JB King
+1 Because I really like the sentiment here. It's not the sexiest thing in the world to know, but being familiar with different development processes is a very useful skill.
DivineWolfwood
+1  A: 

Script or write programs for test work. That includes:

  • scripting tests that are repetitive
  • creating data sets using programs
  • creating tools that will speed up build and deployment
  • diagnosing problems and errors - data verification, data analysis, etc.

Double check with management that they haven't already assigned someone else to the task, though, so you aren't stepping on toes. But in any big project, there are a zillion annoying repetitive jobs that can be done away with by writing a bit of code.

Writing the code gives you a chance to get hands on, a chance to improve the lives of your team mates, and it brings you into contact with actual users (the other testers) who will readily give "feedback" (aka complaints) when they want something more from your tool. Which gives you a chance to learn how to redesign things -- critical in any project.

Pretty quickly, if your manager is at all clueful, they will realize you are a go getter and an asset to the company. And that you have a really good understanding of code and how to write it. This gives you one of two options:

  • Build yourself a niche as a tool developer within the company.
  • Show that you know the product and its test processes very well and should move to development in your company.

If you aren't interested in the company's business, then don't bother. I'd say, in that case, join an open source project and move towards an industry you're interested in.

bethlakshmi
A: 

Write something that DOES something.

Don't just write "in a language". Write a puzzle game, write something that autogenerates syntactic English, write a fractal generator, write a news site scraper that you can use to get your daily headlines or comics....anything.

Pick something interesting to you and follow it from top to bottom: identify requirements, write a test suite, manage your development, track bugs, have user stories, implement, test, show your friends, get their feedback, make it better, make it great.

Good programmers understand that code is one piece in a large puzzle. It affects how they code.

Alex Feinman
A: 

For real-world examples, look for open-source code and just mess with it (maybe altering the software to do something a little different in some way). Don't be afraid to fail... you'll learn more from your failures than you will from your successes. Figure out why you failed, and try to fix it.

Why?

You will gain experience reading other people's code (which is necessary for maintaining code in any job you find). You will also learn how to fix problems as necessary. You will see how other people did things, and you will see why you should or shouldn't do things in the way that you saw (or, perhaps, even in the way you modified it).

After a while, you'll want to try building something of your own from the ground up. Go ahead and do so. Figure out what you want to do, and how you want to do it. Then design and implement your code. Just do it. Sure, you'll probably mess up, but you'll learn a lot through the failures. Better to fail when it doesn't matter than to fail when there's money on the line.

Do not be afraid to fail, at least not when you're in a controlled environment where the failure won't matter. Fail as much as possible, and learn from your failures.

Over 20 years later, I still read other people's code, and I still mess around and experiment with code in an effort to fail, and learn from my failures.

fleeb
+3  A: 

If you are working in testing - learn a scripting language such as Perl or Python and try and write simple programs to help in your job. i.e. setup test environments, parse test results and logs, write a simple log viewer etc.

Pretty soon your simple programs will become more sophisticated.

And then go back and rewrite your first efforts.

Learning to reread and rewrite what you have done is a powerful thing (not just in programming either). I look at code and documentation I wrote a few weeks ago and can find lots of improvements. You will become a better programmer if you learn from your mistakes.

You should also learn how to use your tools: version control, an IDE, unit testing tools etc. Great developers tend to be masters of their tools in my experience.

Fortyrunner
+1 for the "learn by doing _and_redoing_" approach.
CPerkins
A: 

First of all, this is a fascinating world, and almost endless, but you have to find coding fun to want to be here.

There is a lot to learn in order to be a good programmer (since you need to know your tools) but there is nothing wrong with starting small and go from there. What I understand from your description is you want to learn something useful you can use NOW. Here I would recommend books from the Pragmatic Programmer series.

First, Learn to Program by Chris Pine - http://pragprog.com/titles/ltp2/learn-to-program-2nd-edition - which uses Ruby and completes your basic knowledge so you know how to program.

Then, Practical Programming: An Introduction to Computer Science Using Python - http://pragprog.com/titles/gwpy/practical-programming - seems really nice. From the description "Did you ever wonder how computers represent DNA? How they can download a web page containing population data and analyze it to spot trends? Or how they can change the colors in a color photograph? If so, this book is for you. By the time you’re done, you’ll know how to do all of that and a lot more."

By then you will have learned two modern computer languages and written several useful programs, which hopefully will give you knowledge to allow you to learn more and have a gut-feeling about where to go from there.

I wish you luck. It is a steep climb but the view is gorgeous :)

Thorbjørn Ravn Andersen