I once explained (in this post) why so many people prefer to start programming by learning Python. Shortly - it allows very gentle start without overloading one with tons of special concepts - and on the other hand it is not a toy, but industrial-level language, used for development of well-known applications and sites.
So how can someone start learning it? Generally you get python interpreter and some book (official tutorials will do). But I dare to link also some web-resources of different kind.
Let me discuss few books, online courses, and interactive exercises I am acquainted with. I will mention only free resources.
Books
Learn Python The Hard Way (site) (book) - it is a well-known “bestseller”, which starts from basics and leads you in depths. If you feel comfortable with it you probably will not need most of additional resources.
Official Documentation: tutorial along with language reference and library reference - they should be your closest friends. They are well written and provide you full explanation of every subject of the language. As beginner you may prefer tutorial and by and by you will get used to have a look into language and library reference for getting detailed information on certain things you encounter in other books, courses and examples.
Online Courses
Interactive Programming in Python at Coursera - great for beginners - they use javascript implementation of Python (see “Skulpt”) to create simple games running directly in your browser. This implementation is similar to Python 2.6 however and surely is not very efficient - nevertheless it is great for learning purpose.
Learn Program Using Python at EdX - this is a straightforward beginner’s course. For me difference is in that is more “academic” then one above - and the EdX site itself having somewhat nicer and less buggy interface compared to Coursera.
Intro to Computer Science and Python at EdX - this feels like more advanced course, requiring participants not only learn the basic of language but also study more general concepts (algorithms, data structures, testing and debugging). I strongly recommend this one.
Interactive exercises
Everyone will tell you that no one can master programming without dedicating 90% of time to practice. Just reading books and watching videos are not enough. So you need do some coding every day and you need to find or invent exercises which are suitable for your level.
CodeCademy for Python - probably one of the best known. It allows you to lay your hands on Python at once and go through a set of very detailed exercises to learn all of the basic concepts by doing. However it is really very basic level - and you will usually get through it very fast and start wondering where to go further.
CodeAbbey - collection of coding problems starting from very simple ones - they could be solved in any language, though Python is most popular at this site. What is important, after solving you can (and you are advised to) browse others’ solutions to learn how the same code could be written, perhaps, better. Certificates are granted for solving 125 exercises to help you keep motivated.
Though I’m using AdSense banners at my site CodeAbbey mainly to serve stats to Alexa. However I’m of course curious about small money awarded by AdSense. If in future they will cover hosting expences, this would be nice.
Recently I’ve done small changes to my site and after few months I was surprised to see that ads revenue increased about three times! Though it was not my goal, I thought it is cool “secondary effect”. So let’s see what these changes were about.
You know that Google AdSense allows site owner to insert small script which loads ads banners - and then award money for several kinds of using these banners - mainly for two of them:
- some banners bring money just for showing them - though the rate is usually low, about few cents for thousand “impressions”;
- for other ads we are only paid if some user clicks them - here the rate is usually between few cents and a dollar - say about 50 cents on average.
Google does not allow to choose directly which type of banners should be shown.
Main problem with banners is that users get used to them - especially if they are not very large and do not contain some too attractive pictures. So as they get used with the site, they grow a blind spot in their eye at the place where banners are shown.
What I’ve done was adding custom “banners”. They are not ads, strictly speaking - just pieces of information or hints I want to show my users randomly. Say, about interesting courses at coursera, good books, opensource opportunities.
So technically I’ve done the following:
1. Created an end-point (url) which serves random “custom ad” from the file I can edit (it has basic formatting, link encoding etc.)
2. Changed the ads insertion block so that it inserts either google ads or mine, with probability about 30% (for mine ones). So sometimes pages opens with my “ads” instead of google’s.
Of course I lose some revenue because technically speaking I now show 30% less google ads. But on the other hand, my “custom ads” attract people’s attention (I added simple counter and see they are far more popular than google’s) - by providing relevant content - and by having different color - so it seems like they help to remove this “blind spot” and make people look into the corner with ads more often.
So by adding a half-hundred lines of code I have two goals achieved:
- I can easily add any interesting information to ads at any time (previously sometimes I had something to share but just did not know where or how to insert it to the site);
- the ads revenue was increased several times without harming anything.
At some point I’ve found it is good to keep my personal ToDo notes about any coding I do - either my personal projects, or some exercises, even Coursera courses I take.
The main idea is that often I get some thought when I could not immediately start working on it...
For example I’ve heard about interesting programming puzzle. Or I read about some SEO improvement which I can apply to my site. Sometimes such ideas need further consideration (and perhaps they never will be implemented) but it is good to write them down somewhere.
And when the time comes that I have some free time and can’t remember about anything urgent to do, I just open my ToDo list and at once find several things I can do. I choose one or more depending on how many time I have - and in a hour or two I close the issue.
This looked like just minor time-management optimization for me at first, but as the task list grows I understand it is quite valuable thing. Really, some notes may hang here for almost a year waiting when I come up with solution for them.
How to keep them? There are many ways and many tools. I prefer them be accessible over internet, so I can add notes either from work or from home, or from my mobile. I choose GitHub for it. Just created an empty project in my account (we may call it ToDo for example) and start adding issues here.
Notes for certain large side-project could be grouped at separate tracker (separate github project) of course. At the picture above you can see how issue tracker for my CodeAbbey site looks like right now.
So if you still do not keep notes - why not start right now? Login to github, create your todo list and fill it with first five records. Visit it every day and spend five minutes thinking is there anything to add, or could one of existing tasks be solved today... Hope you will find it useful yourself :)
Hundreds of times I have come across the people who have the idea. Well, really they come across me to consult. Usually it looks like:
- Ahoy friend! I have a million-dollars idea!
- Eh-hm... Congrats.
- I could not do it myself, so I want to make friendship with some developer who will do this for me and we’ll share profit (as I have no ready money too).
- Well. Best Luck to you.
- But how can I patent my Idea so that intended team-mates could not steal it?
Short answer: YOU CAN’T
You can patent something precise. Some algorithm. Some mechanism. Some formula. I.e. some invention.
But idea is quite abstract. You were sitting in your arm-chair, eating cherries or puffing your pipe and come with the idea of some game or some web-site? Nice. But there are billions of people and some of them also were sitting in chairs and in the mood of generating ideas. So, believe me, many came to similar idea. Probably some even tried to implement it (yes, do not forget to research)...
You should not think that as soon as you have some less or more vague “Idea” you can sell it to investor or entrepreneur and spend the rest of your life in richness.
It does not work this way. Even more, you should get ready to the fact that no one believes in your idea - neither investors, nor developers. Sad truth is that idea is nothing until you at least have some working prototype, or gather some money to build it with others’ hands.
One of the reasons is that as working on idea is in progress, a lot of changes tend to appear. Some proposed by you, some by your technical assistants or designers, and many proposed by your intended users (they do know better what they want of your idea). So the “initial idea” is really worthless by itself.
If you still do not believe, think of some famous game like “Angry Birds” or “Tetris”. Their brand names are protected - you will surely get banned if you publish the game with such name (e.g. “very angry birds” or “color tetris”) - but still there are zounds of clones under different names. Why is it so? Because cloning the idea is not restricted.
To make idea winning you a fortune you need to put some efforts - to implement it, to advertise it, to maintain and extend it. So it is not your idea that will bring you the fortune, but your hard work on this idea.
You probably know these articles about FizzBuzz: authors point out that many developers (even experienced) are very poor in implementing simplest task when they are interviewed. Example article.
I agree with them heartily - I also meet many people who suck in basic logic and writing basic code. However, now I'm going to have a bit of fun discussing possible implementations. How could this be written? How do you write it? What are common and uncommon ways?
I dare to remind the problem statement: Print integers from 1 to 100, but for each of them divisible by 3 put Fizz instead - and for each divisible by 5 put Buzz instead. If the value is divisible by both - output FizzBuzz.
Let us see. Here is the basic approach (in Python) - it was often written by school pupils when I ask them:
for i in range(1, 101): if i % 15 == 0: print("FizzBuzz") elif i % 3 == 0: print("Fizz") elif i % 5 == 0: print("Buzz") else: print(i)
What we do not like about this code? it looks like here is more branches than necessary because we check i % 15 case separately. We can make some trick here - printing FizzBuzz as consisting of two parts :
for i in range(1, 101): s = '' if i % 3 == 0: s += 'Fizz' if i % 5 == 0: s += 'Buzz' print(s if s != '' else str(i))
Could this be improved? Or made more funny? Surely! Let us use some arithmetic and small array of answers:
a = ['0', 'Fizz', 'Buzz', 'FizzBuzz'] while a[0] != '100': v = int(a[0]) + 1 a[0] = str(v) print(a[(1 if v % 3 == 0 else 0) + (2 if v % 5 == 0 else 0)])
At least this can puzzle your interviewer for a minute or two...
But it is not the end of heresy. A friend of mine, when I told her about FizzBuzz said that she do not remember how modulo operator is written or used. :)
But we can do without modulo, of course! Moreover, here is an example of problem where you can not use modulo (it is hard to implement in the proposed language): FizzBuzz in Asm.
Our second version is the most suitable to be modified for such a case:
cnt3 = 0 cnt5 = 0 for i in range(1, 101): s = '' cnt3 += 1 cnt5 += 1 if cnt3 == 3: cnt3 = 0 s += 'Fizz' if cnt5 == 5: cnt5 = 0 s += 'Buzz' print(s if s != '' else str(i))
You see, we simply use two counter running up to 3 and 5 instead of using modulo operation - though this makes solution bit longer. But still it could be a useful trick for cases for platforms where division / modulo operations are costly.
So here are a few of my solutions. Would you like to propose some of your own - probably, more funny? Please feel free to paste them in comments!
It is a quite popular thing to claim that PHP is a veeeeery baaad language. Often these claims are made by people who do not have much experience with PHP, but have read some great articles like PHP - a fractal of bad design.
When I ask "which language you recommend instead" - about 50% of these people shout JavaScript for sure! I always suspect there should be something wrong, since JavaScript has many features similar to PHP - c-like syntax, lack of strict typing and lack of complicated data structures offering instead array-on-steroids.
I myself extensively use both (as many as several others) and so I decided to make some comparison.
Can you guess why JavaScript sometimes looks similar to spork like this?
1. Basic values
PHP is popularly blamed for usage of two equality operators - double and triple ones. But it is just the same with JavaScript. Moreover you surely encountered many funny things like these:
" \t\r\n" == 0 // yields true
"false" == false // yields false
!!null == null // yields false
Of course JS have explanation for all such behavior. But it does not make more sense usually :)
2. Basic operations
This is really great. If you use some wrong operations on some wrong operands - in PHP you get an error so you can fix your mistake. But not in JS:
sum of two arrays [] + [] yields '' (empty string)
sum of array with object [] + {} yields an ojbject
sum of object with array {} + [] instead gives you 0 (zero)
and sum of two objects {} + {} is NaN (undetermined numeric value)
Subtraction behaves in a different manner, but you may have fun testing it yourself! Using empty string instead of array or object you may get few more curious results.
What is important - no error is generated! So if due to loose-typing your variables get some wrong values (it happens often enough, you know) - you will not at once detect something goes wrong.
3. Basic API
It is important to have a good library of tools at hand. Library functions provided by PHP are often blamed for performing too various functions and their names being spelled in different styles (due to inheritance from C).
Meanwhile in JavaScript:
you have substring and substr and you never remember which is what
if you want to format number (as with sprintf or number_format) you usually can only use few manual tricks like taking substring of number prepended with string of zeroes etc
some methods behave differently across implementations - famous example is with split - less famous with forEach on arrays (not jQuery-based one) which in certain implementations (like Rhino) for array with only two indices 0 and 100000000 will enter a loop of billion iterations.
Of course all these are only minor annoying things, I just mention them to express my point of view that there is nothing JS could boast.
4. Object-Oriented Design
JavaScript simply has no proper implementation for OOP. Yes there are functions and their prototypes which could be used in some verbose and clumsy manner to mimic OO design in some or other way depending on your needs. But far not covering all fundamental principles of OOP.
Meanwhile PHP provides all things about classes, interfaces, methods, constructors, fields, packages, their visibility etc in very similar manner to how Java does this.
Of course JS-guys usually answer "we do not need it. we get used to prototype-based design" however it looks the same as grown individual who got used to diapers.
I'm sorry to say this, but when almost every contemporary language have all necessary features for writing OO-programs, it is strange to say that "we do not need this, we prefer mimic this with some makeshift substitutions".
5. Using JS + Node + Mongo architecture
The popular thing is to say that with JS you can write the whole application in a single language. Just use it on client side, on server (as Node.js) and in the database (MongoDb).
However this idea looks nice only until you really try it. When you really try, you find out several nasty things:
you still need to learn quite different versions of JavaScript - some front-end frameworks, NodeJs API and API for Mongo - so the same language behind them does not help much
using NoSQL database for your business-data is ok only while you have few collections and need no complicated queries to them involving joins - usually you found this mistake too late because your customer asked a new kind of report and you see that hundreds lines of code should be written manually instead of three lines of SQL query; there is nothing to do with it - Mongo is a special database, for special purposes - and it is better to use it for such purposes, rather than try to fit it as a universal tool for every need.
the last is most important for beginners - to host NodeJs server with MongoDb you have far fewer choices than with PHP and MySQL - for free you can try it mainly at Heroku and OpenShift - or you can use paid plans there, or purchase VPS, however with latter you'll need to care of setup yourself.
So though it initially sounds interesting, really it appears that the only (vague) advantage this approach offers is "you use a single language". But is it really an advantage? Look at this picture above - now you know why it is there!
It is one tool to be used for several purpose. But I bet you do not want it to be offered to you at restaurant. You prefer to use spoon for soup and fork for beef.
The same is with building web-applications - it is easier to learn several proper tools (e.g. HTML+JS at frontend, PHP at server and SQL for database) rather than to struggle with universal one.
While learning how to program it is useful not only to solve enough simple exercises (to learn the language and build general coding skills) - but also to attempt creating larger projects, at least sometimes.
Though this idea is that simple, many beginners could not come up with proper idea for such a project. Though usually they are impeded by one of only few general mistakes in this choice.
1. TOO LARGE PROJECTS
Trying to create something far exceeding your resources is the straightest way to despair.
One guy I know is obsessed with idea of creating ultra-cool web-application in the field of tourism. For several months already he is busy comparing his future application with TripAdvisor and other "rivals" and trying to calculate his future incomes and invent more ways of getting money flow from his future site. It is needless to say his work on the site itself almost does not move. And even if he will create some great site, he still is to face the problem of promoting it.
Advice1: if you are not sure how large your project is, try to describe it as well as you can and ask about it in the forum etc.
Advice2: if you realized your project is too large - try to see, whether it could be reduced for making its "first stage" significantly simpler to reach - that is how large projects naturally evolve.
2. TOO COMPLICATED PROJECTS
If you invented some project about which you completely have no idea how it should work like - probably it is not the good idea.
For example, if you want to write a kind of multiplayer game for mobile platform, and found that you:
have no experience in writing games;
know nothing about servers, clients, protocols and other things important for multiplayer infrastructure;
have no knowledge of desired mobile platform (e.g. iOS or Android);
Then probably you should not try this right now.
Advice: but you see, the task could be decomposed - e.g. in the three questions I outlined above - and you can try to create three small projects to learn each of these field:
try to write small single-player desktop (or client-side web) game to become acquainted with graphics, user controls, updating and rendering game state etc;
practice in building small (even console-based) chat for several participants;
lay your hands on tutorial (e.g. for Android) and write few simple programs for this platform to learn its features.
3. TOO SIMPLE PROJECTS
While "Large" and "Complicated" projects are sometimes related (though there exist simple-and-large and also small-and-complex ones) this is very different.
One of my colleagues after his internship was told to create "graduation" project. He was hinted on several possible topics, but he decided they are too complicated. Instead he created some cute demo in JavaScript (he was front-end trainee). Of course he succeeded and of course all reviewers kindly said "nice".
However he learned close to nothing new from it. Project does not use any backend or 3d party API - because the guy decided he should not touch anything he do not know.
Well, he is still sitting on the bench and waiting invitation, though several months had elapsed. Not that employer is evil, but there just are no projects for such primitive set of skills.
With the same success he could instead work on basic exercises - though he does not like exercises either - which is another problem preventing him to secure a job.
4. TO WANT AND TO DO
The last thing I wanted to say, though it is not exactly about projects.
Many people I know are too hesitant or too lazy to start working even after they came up with idea.
They are telling about such projects to all their friends and colleagues day after day, they are "considering" these projects. They are asking "whether it would be useful", or "would I be hired if showing it to anyone" or "perhaps I can come up with better idea" etc.
I'd say that Intention is not Action. You anyway should write something day after day if you are pursuing programming career. You can think while eating, or before sleeping - so do not waste all your time on thinking.
Unless you really want to be a philosopher rather than a programmer.
5. EXAMPLES
Here I'm going to collect few links to other posts describing people's side projects which looks relevant to their skills:
My solutions of qualification round for Facebook Hackercup 2015
Facebook Hackercup is a popular annual challenge for programmers. You need to solve some abstract programming problems (e.g. process data from input file and write them to output), advance to the next round etc. If you are lucky (and skilled in competitive programming) enough - you may eventually get a cool t-shirt or even money prize of up to $10000 (read more).
It starts with qualification round - during 3 days you should solve at least one of 3 problems to advance further. Today was the last day of 3 and I collected enough moral powers to try. I spend about a hour to solve 2 problems and here is my report in brief.
1-st problem
Speaking shortly, it was like following:
You are given a number of up to 9 digits. You are allowed to swap two digits. Print the largest and the smallest values which could be obtained by this operation.
I've created similar problem at my site for those who want to practice it.
With given limits - about 100 numbers - it became obvious at once that I can simply try to swap every pair of digits (which will take less than 100 iterations) and simply find minimum and maximum. So this problem is of "for implementation" kind - it requires no special algorithmic knowledge but only careful coding.
2-nd problem
It was about a person who has N items of food and for each item we know amount of carbohydrates, proteins and fats it will produce (Ci, Pi, Fi). The goal was to find out whether we can choose some items so that their total will yield exactly required amount of all three components (Cs, Ps, Fs).
I also created similar problem at my site so you can get better idea.
I.e. it was like a knapsack, but with three values for each item instead of one.
I have no idea how to solve it in general form, but I at once realized that limits are very low - no more than 20 items of food are supposed. So it became evident that I can simply try every subset of items - there are only about 2^20 i.e. one million of them. Modern computers process from 1 to 10 million iterations per second - so I have plenty of time to process data and submit solution in allowed time (6 minutes).
Conclusion
I haven't even read the third problem since only one is required to advance to the next round. We'll see if my solutions were correct very soon.
Now you know that at least at qualification round this challenge is very simple, so I dare to recommend you give it a try next year! I hope that my "clones" of hackercup problems will help those wanting to practice and prepare for future challenges.
Should you read The Art of Computer Programming by Knuth?
Here are Knuth, Cormen and Sedgewick - authors of different books on Algorithms.
As many people are learning Computer Science in Universities - many come upon this book. So the question arises again and again at forums.
Couple of decades ago, in the end of 20-th century this book was regarded as classic and super-must-read. But as more time have passed things have changed, almost dramatically.
So my answer is NO. You'd better try more modern books by Cormen or Sedgewick.
What is wrong with Knuth? Could it be that algorithms changed that much?
Algorithms do not change. But the science of algorithms have evolved significantly. Famous example is about asymmetric encoding - in 1970-s no one could imagine that encrypted communication may be established without exchanging some key first.
All approaches to data compression which nowadays are regarded as "basic" were developed after Knuth published his books.
While Knuth will show you a handful of whimsical logarithmic sorts - you should know that nowadays mainly just a few of them are used (e.g. QuickSort, MergeSort and HeapSort), and always significantly improved with some special tricks.
Knuth will pour on you tons of words and formulas regarding simplest algorithms, and data structures - e.g. binary trees. But nowadays several complicated implementations of self-balancing trees are popular and it is far more beneficial to know some details about them rather than abstract math considerations.
Even if it is not for Knuth - but the paradigms significantly changed during the half of century. Nowadays CPU speed could not be increased significantly more so computational power instead grows by multiplying the number of CPU cores. That leads to increasing interest to algorithms which could be easily scaled to parallel processing - and so some cool algorithms of yesterday fell out of favor for lacking this valuable property.
You are not going to learn much about Heaps, Hashtables, B-Trees, Tries, Fenwick Trees from Knuth (though some of ideas are outlined there) in spite of the great volume of information you devour (4 books!) - while nowadays most schoolboys participating in competitive programming can tell you lectures on them.
You probably is not still convinced?
Then open Knuth's Table of Content and find Graphs. It is impossible to imagine any contemporary algorithm course without discussing Graphs. But where they are in TAOCP? They are going to be published in the next volume which was scheduled to 2020!
But do not despair! Instead of such knowledge you will spend much efforts on learning imaginary language MIXAL for imaginary computer MIX - it is a kind of Assembly Language used for giving some examples in the book. This knowledge is far from being immediately useful, but you at least will have some fun :)
Conclusion
So you see - you can read TAOCP, but only if it is out of curiosity. If instead it is a matter of your education - especially if you have not much time to spend - use other books.
Which ones? I dare to give principally two titles:
Thomas Cormen - Introduction to Algorithms (while it is called "introduction" it covers very wide range of topics)
Robert Sedgewick - Algorithms
They could be easily found on Amazon (and you even can find some free editions and drafts, I believe).
Also note that Mr. Sedgewick conducts a class on Algorithms at Coursera, which, though does not offer "certificates" is regarded as one of the best at this resource.
This is not strictly IT-related, but often asked especially by beginners :)
Programming involves learning and remembering many things. And it of course we have two general problems with our memory:
how to remember something new;
and how not to forget something we already know.
Different people have different abilities and it is not really great problem if you find your memory is not excellent. I once read the following phrase by Abraham Lincoln:
My mind is like a piece of steel, very hard to scratch any thing on it and almost impossible after you get it there to rub it out.
So it is only important to be acquainted with peculiarities of your own mind and use it properly and in convenient way to your advantage.
The only way of remembering something is to repeat the information several times. However, "mechanical" repetition is not the best approach.
There are several good ideas to improve the learning process.
Repetition should be wisely timed. For example after you read something important (like the new portion of irregular English / French verbs etc, ha-ha) - it is good to repeat it few times at once. Then set them aside for some period - and try to repeat few times again after passing about a hour. Next series of repetition should take place after about 10 hours or a day. For me I found such way most efficient.
Repeat in different ways, if possible "practice" new information. Lincoln read important things aloud to himself - so that he can see information, can speak and can hear it. I prefer write information down several times - so remembering it by eyes and by fingers. If it is about irregular verbs etc. - I also try to construct several sentences with them - and if it is something about programming, I try to invent small demonstrative code snippet - or find some exercise which will help me.
Another important thing is that even if you forget something - it would be later significantly easier to recollect - comparing to if you did not know it at all. As a Java developer I need to use vast number of frameworks and libraries - and I never can remember all particular things about them, names of complicated classes and methods - but it is far easier to google when you know what you are googling for. So Google is quite important weapon of contemporary programmer...
You may find your own ways. The most important is not to despair if you feel your learning skills are not the best. They could be trained by and by as anything other. And of course it is normal to remember some things easier than other. Chess grandmaster Richard Reti once conducted simultaneous "blind" game in a couple of dozen boards - i.e. he held in his imagination positions of about thousand pieces every second. Nevertheless when leaving the event he forgot his case and when returned for it he said "Ha-ha, I have so poor memory!" :)
When I was starting my career of Junior Java Developer I was very interested in getting some beautiful certificate. As I grow professionally my views changed to opposite. I think I can share them to you to help in your chosen path.
There are many certifications from well known companies. For example:
Microsoft is certifying for bunch of its products, platforms and few languages - like Office, Visual Studio, SQL Server, C#.
Oracle in similar manner can give you several certificates for different fields of Java programming and Oracle database.
BrainBench and similar companies just provide exams for almost everything possible.
Of course all of them cost money.
At first, why I did not get certificate in Java myself (though I was preparing to it). When I started, the structure of certification was as following: you could get "Sun Certified Java Programmer" and optionally simpler "Associate" level certificates. Then you can get to second level of "Java Developer", "EE Developer" etc.
When I felt myself prepared - I've found that Java 7 is soon to come. I decided to wait for updated versions of certification. This process was slow because Oracle have taken Java from Sun, I think. At last they published certification for Java 7. But now Java 8 was looming - with its major changes (lambdas, streams in collections etc). I was already working as middle developer and decided to wait a bit more. But it seemed Oracle has hard time with 8-th version and it was postponed a couple of times.
When Java 8 was at last ready, I've already changed several positions of Senior Developer. I knew that no one is going to introduce Java 8 in production soon - and moreover I learned that no one cares about certificates!
Why is it so?
Most certifications cover some quite narrow field. Basic Java certification covers mainly syntax and core abilities of the language, virtual machine and a bit of API. So though it is a tough exam, it is quite possible to get such certificate and get no idea of industrial-scale using of Java.
My colleague claims that among people he was interviewing during the course of last years there were several with Java Programmer certificate, who were still very hopeless in the sense of general programming - lacking knowledge of basic algorithms, being ignorant of most popular tools and frameworks used in Java. So there was neither reason nor chance for them to be hired.
So should we then get certificate of EE developer later? Probably, but will it be worth without some SQL certification since every sane application uses a kind of database?
Then, perhaps, you need 3 or 4 certificates to feel yourself confident? It could be so, but this will take significant time and you meanwhile can found yourself senior developer or team lead already.
The other horrible truth is that higher level certificates are so rare, that very few people know what are they worth at all.
When certificates are still useful
Certificates could be required by customer. Though customers probably may not know much of their value (or on contrary know it very well) - they may require, for example, that at least 5 persons of the team have such and such certificates. This may be helpful, for example, for certifying the product itself.
Usually this is solved by your company - i.e. when you are hired for such project, you are told to prepare for certification (a couple of months is usually sufficient) and is certified with expenses paid by your employer instead of you.
Another important point is, of course, that while preparing for certification you necessarily get some specific knowledge. It may happen that you will forget part of this knowledge later, but learning is always very good.
The last but not least is that certificates drive your motivation and (when you get them) self-estimation. It is of course quite important for beginner helping to prevent despair and leaving the study. :)
Concluding
If you have strong intention and free money to spend - go on with certification. It will not harm, it will teach you something of course.
But if you do not feel inclined or have no much finances - do not think this will impede your progress. You may always invest your time into getting "certificate" from some of free courses like Coursera or even from 3-rd party sites like mine. Yes, Certificates at CodeAbbey are free and also useless (like ones of Coursera) - but nevertheless they can serve your motivation and self-estimation. And they are simply beautiful enough to hang on the wall over your desk :)
Really - at interviews during last couple of years I was several times asked of the courses I completed at Coursera, of my ranks at TopCoder and Codeforces (just once) - but never about Oracle certificates. Except one case when I was asked to be able to get certified during probation period (though eventually I did not got hired at this company since they were offering smaller wages compared to some other which made me an offer).
Imagine that someone tell you "I can control the weather! Do you want tomorrow be sunny? The price is only $49.5 - and there is money-back if I'll fail!"
This sounds ridiculous. Tomorrow could be sunny or not - and if it is, you lose your money. If it is not - you gain nothing.
It is similar with programming - whether you learn it or not depends on you. Any courses can provide just a bit of motivation and a bit of information. But as of information, you will nevertheless gather 95% of necessary info yourself (since none of the courses have such capacity). And as of motivation - of course you are to build most part of it yourself. Either you want to learn programming or not. And if you really do not - then no tutor can really help you. It is normal that some people find they do not like programming - all people are different and have different interests. To be successful it is just important to do what you like and not what you think you should.
And meanwhile there are free courses!
They work well both in sense of providing you with motivation and information. Even better since usually they are attended by more people and are thus driven to be relevant to wishes of most of their students. Information of them and their syllabus is open and so spreads far better.
And what is more important - if you find the course difficult or not corresponding to your intentions - you can leave it any time.
These courses usually provide additional services for payment - like more beautiful certificates and some kind of verifying your identity in some way. Also they may have some support from employers who are allowed to browse students' profiles. But it is important that you can get the whole classes spending nothing except your time and your efforts.
Now let me list few of largest collections of free courses:
Coursera - is probably the best known - I learned few courses about algorithms here, also about Cryptography, Machine Learning and Big Data.
EdX - it is less known, but technically their platform feels better - often you can find here good courses if you miss some session at Coursera. I tried course on Haskell here and going to attend another on Python.
MIT open CourseWare - this is also mature platform more targeted to technical courses. You may find popular CSxx classes here.
What about diplomas or certificates
Many people ask whether certificates of free courses are respected by employers.
I should say - usually no.
But it is just the same with paid courses. Even worse - at interview you have greater chance to met people who attended the same free course, but almost no chance to met those who even heard of some paid course you have completed - just because paid courses have smaller audience.
So certificates are mainly important for your motivation. To be hired you need to present only yours kills, not any papers. But it is what your courses and your devotion should build for you. Good luck! :)
This post is bit too long. At first I'll explain why it is hard to find a project to contribute to, so you can avoid typical mistakes. Then I'll try to give some practical advice on searching for the project.
Why is it so hard to find a project?
Most general problem of beginners is the lack of experience. Not only experience in specific programming language, but also ignorance of popular tools for code management, building the project etc.
For example, project sources are usually hosted in some repository with the help of some Version Control System like Git or SVN. If you do not know the system used by other developers of the project - no one is going to teach you. And if you do not know how to use necessary build tool, like maven - no one is going to explain you how to build the project (unless some special steps are explained in documentation.
Why people do not want to explain you all thoroughly? Mostly because 90% of potential newbie contributors are not going to proceed far. They lose their determination after a day or two studying the project. So any time spent on unknown beginner is potentially just lost time.
Second problem is the lack of accuracy. Once I allowed some student to help in my small project building the demo for it. After some kicking and explanations the required java applet was created - it was very small one. But the code was somewhat horrible. Wrong indentation, poor naming conventions - and a handful of mistakes like "Genarotor" instead of "Generator".
The third problem is that while many beginners want to develop some great new features in some great projects - they should instead look at first for small bug-fixing (and probably in some smaller projects). So they simply search in wrong direction. Implementing of great new features usually require good knowledge of the project so it just could not be assigned to new team member.
Now, how could you still find a project?
At first, decide where are you going to search. Most popular platform is GitHub, though many good projects are also hosted at SourceForge and other places.
So if you are going to do it with, say, GitHub - surely you should at first learn how to use this site. Of course you need to learn at least basic operations with Git version control system. So register here, create some basic projects, try to commit to them, clone and pull from them - even create branches and pull requests to see how it works. Learn to use it.
Next decide what language is your main. For example it could be Java, C++ or PHP. Usually it would be important to know several, especially for web-projects. Learn about some tools for your language. For C++ learn about several compilers (like MSVC and GCC). Understand the usage of "make" tool (or "maven" for Java, or "nuget" for C#). Practice with it.
No go to GitHub Search and try to create some criteria to find you a list of suitable projects. This could be like following:
language = Java
stars < 10
forks > 3
of the size < 100kb
etc.
Now surf through the list of results. Try to learn about each project - this may take hours or even days. Try to find the project which purpose you understand well. Look for documentation and open issues. Look for accepted pull-requests - to see whether some people already contributed there, and what they have contributed.
Optionally you can choose some project you already know or have been using. For example, I liked MapDB. I found its source.
When you have found a project - clone it and try to build and run. If you can't, even after some time - probably it is better to choose another project. If you succeeded - it is great.
Start exploring project features - see how it works and what for it is used. Then try to investigate its code. Feel free to change anything in your local code - for example start from changing labels on buttons, then adding some buttons or changing their behavior etc.
Usually after some study you anyway come to idea that something needs to be improved. If you will find a clear bug - it would be great at all. For example in case with MapDB I found I could not run current version on my OS due to some nasty NullPointerException, arising from the incorrect manipulations with directory paths.
Try to change the code to achieve your goal, to create necessary improvement. Ideally this should be small change - so that people at once will see it is important and raises no doubts. Then push your changes to remote repository (your own at GitHub) and create a pull-request. Owner of the project will be notified and can review your changes, either accepting or declining them.
If your "invention" is not quite obvious and you are not sure, whether it is needed - you may instead create a ticket. Explain your idea and write that you are ready to implement it. Owner of the project will comment on your issue whether it should be done. After that you can write implementation and create pull-request as explained above.
You also can browse existing tickets (if any) and see if you understand meaning of any and is ready to perform required task. This is one of the best way to contribute - however many project owners are too lazy to work with tickets :)
And still here is another way...
Instead of contributing to other open-source project you may start your own. Use any idea, even simple - this could be basic JavaScript game (like famous 2048), or some JQuery plugin for example.
Create your own repository. Use tickets to set tasks for yourself. Behave like you are working on serious project - and you will learn much in this way. You may even invite some your friends or classmates to contribute to your project. Or search for contributors at forums.
After few projects - even tiny - completed in this way you will see that it is far easier to understand other's sources and contribute to them if you still want to.
Good luck, and please do not forget to share your story if you succeed in contributing your code to anything!
Surely possible! I know more programmers without programming-related degree (or without any at all), than ones having proper CS or SE education. I myself have only bachelor in a branch of automation - which is more about electric drives and (some vague math which I do not remember) - and this does not prevent me from being actively hunted as senior / lead java developer.
But if not a degree, what you need then? Let us shed a bit of light on this dark question.
At first do not mistake CS for SE. Computer Science is most important if you are going to work as scientist in this field. It is also almost crucial to get a position like search engine developer in google. But it is not what you need for development of everyday web-applications, mobile tools etc. Software Engineering on the other hand is closer to such "casual" programming - covering some popular technologies, aspects of architecture, protocols, patterns etc. But degree in SE is not required either, of course.
So what the craft of nowadays programmer consists of? I'd say there are 3 large components:
general programming skills - ability to see instantly how any task could be decomposed into all these loops, conditions, functions, how lists (arrays) and dictionaries (maps) should be used - for example to output some dynamically generated table on your page, or found the country by IP in the list of IP ranges, or how the monsters in your game should move around the maze etc.
fluent knowledge of at least one popular language - of course you may not know the full specification of standard libraries of Python or Java - but you should be fairly well with general syntax and popular tools, you should be able to code simple tasks without significant googling (which is normal when you work with unfamiliar language).
experience with specific tools / libraries / frameworks - each field have many of them, there are web-servers, mobile platforms, APIs etc. E.g. if you are going to make web-apps in PHP - you are expected to know something like Symfony, a bit of JavaScript and SQL. If you are going to do Android programming - then knowledge of Android platform, Java tools like Maven and things like Google Play will be to your great advantage.
The first time you will be searching for job, you are not expected to have a lot of portfolio projects and knowledge of tools and APIs, so your first employer will often try to test you for "general programming" and knowledge of the language.
Nevertheless it is crucial to have some experience with technologies (the 3-rd component of mentioned above), so you should find out which are relevant to the field of programming you are targeting at.
So it is important that at some point you decide firmly to which goal you are aiming. Is it web-development of some kind? Or programming for mobile devices? There are really quite many branches, so I will try to list and discuss them better in separate post.
Probably many of you at least heard of this common thing - but as recently another one colleague complained of the same google's behavior, I decided to post my short story so that more people could be aware of this unpleasant trouble.
One and half year ago I decided to learn a bit of Android development. I had the idea of some primitive game and after some efforts wrote a clumsy implementation. Then I pushed it to Google Play. Though quite poor in design (as you may see here), it enjoyed some user's activity and get about 1000 installs in a month. Meanwhile I was trying to improve my skills and write something more... and then...
I got a letter from Google, it started with:
This is a notification that your application, Wordys - word tetris, with package ID none.rg.wordys, has been removed from the Google Play Store.
REASON FOR REMOVAL: Alleged trademark infringement.
What happened? Letter was not quite clear, but researching a bit I've found that Tetris is a trademark and some special company Blue Planet Software complained to Google about my using it in the title of the game.
I admit this was my fault, but I have no idea that Tetris is a trademark since many games also use this title (and I've seen in the google's letter many also were removed).
The only choice Google proposed was to "fix the problem" and upload application as a new one.
What is bad in the Google's behavior, I think:
they do not send warning to you, suggesting changing the title for example - just delete your application (with losing stats, votes, links etc)!
they provide no way to send appeal or something like this - they only offer to contact Blue Planet Software itself.
they plainly say it is alleged infringement - i.e. they do not care to check or contact you.
My colleague got into similar situation - but instead the word "Tetris" in the title he have functionality of tetris in the part of the game and mentioned it in description. Since it was more than year later, the letter he received was slightly different in format, but also quite unclear (so he have no idea about the nature of violation) - and also mentioned Blue Planet Software.
So be on watch and learn from our mistakes. Good luck and happy coding! :)
I used to esteem Google very high. And it is still the search engine I use most of time. However as I become more acquainted with its numerous services and activities, I find more points for suspicions and discontent...
Google is well known for its strange behavior about banning "sexually implicit materials" from Google Play (read here).
Your apps in Google Play could also be banned for "copyright infringement" or above mentioned violations without check (and often without much explanations) only upon complaint of Google's partners. No warnings or appeals. Independent developers may suffer even for usage of the words like "Tetris" (haven't you know it is tratemark?)
Google can share your business info without you well understanding this. Add some banners from Google AdWords to your site and see that your Alexa rank is soon changed. Remove banners and it is changed back. The data about visits and pageviews are shared with Amazon which owns Alexa. Usually it is not a problem (especially if your Alexa rank grows) - however you will hardly find info about this. That is why some people even prefer to use piwik instead of Google Analytics.
Though Google promises to show only "good" ads at your site or mobile app, you may soon get complains from your users that it is showing some fraudulent clean-up or antivirus tools with horrible banners like "You got a virus. Start scan now!!!" And you have no ways to disable these ads without significant help of your users. Moreover it sometimes advertises the sites which Google itself marks as suspicious and unsafe (more).
Try Google Custom Search for Sites to see how poor it is. It could not find your content while normal Google can. Instead it shows you lots of stupid ads. I solved this problem switching to similar service from Yandex (more).
Most of Google services looks like being poorly integrated. Google Wallet though thoroughly promoted, still could not be used to pay for Google AdWords or receive money from Google AdSense. Users are offered instead to use some awkward and suspicious 3-rd party money dealers. It sounds insane!
It is well known that Google tries to monopolize certain fields of mobile market, for example by pressing hardware manufacturers to pre-install specific apps (more).
Google prefers to keep private the same cutting-edge technologies, which are developed open-source by Yahoo and FaceBook (like GFS and BigTable in contrast with HDFS and HBase).
Google failed to provide any substantial support to popular and fun contest Google AI Challenge - in later years contests were held without mentioning Google and then seemed to shut completely.
Google actively struggles for its business-interests covering them with the "care of human rights" etc. (article about SOPA and PIPA).
Conclusion
I would say that Google are nevertheless the nice guys and wonderful company. However it is wrong to regard them as:
the universe protector of rights and freedoms;
the great builder of the amazing technological future;
the best example of the company which makes all things perfect.
I'm sorry for this post contains less proof-links than, probably, it should. I hope to improve this, probably with the help of people who read this.
I've tried to collect simple statistics from CodeAbbey users table. Currently it have 3121 users listed and filter allows to see how many of them prefer one language or another:
579 or 18.6% are using C++ or C (they are not distinguished)
219 or 7.0% are using C#
522 or 16.7% are using Java
168 or 5.4% are using JavaScript (which is not Java!)
41 or 1.3% are using PHP
10 or 0.3% are using VisualBasic
1039 or 33.3% are using Python
(in total they cover more than 82% - you can yourself experiment with filter to get more results)
So Python is the obvious leader!
Of course these stats could be somewhat imprecise (for example because not all languages are thought useful for problem solving - that is why PHP has so low percent - and Java has some advantage because some percent of users come here from java forum) - however the main idea is clear.
Python is nowadays very popular for beginners because:
it allows to dive into programming easily, without prior learning classes, methods etc (as with Java) - simplest code in Python will have a single line only;
on the other hand it has all features of mature object oriented language so it is easy to get acquainted with them before learning other languages;
it also have nice functional features allowing to get introduced for further learning of functional languages (like Haskell, Erlang or Scala);
at last, but not least, it is industrial-scale language - many programs and web-applications are written in it - so it is not the language which you learn in vain (like Scratch) without opportunity to find a job in future.
The main disadvantage of Python, as for me, is the existence of not well compatible 2-nd and 3-rd versions. However if you start learning it - prefer 3-rd version, it is more contemporary (while 2-nd is still more widely used in industry - but things are going to change, I hope).