Thursday, December 29, 2011

Egoless Programming

As mentioned earlier, the odd name for these pages comes in part from the idea of Egoless Programming.  To help get the idea across, I'll throw out some suggestions:
  1. You are not your code.
  2. You discard your code for something better.
  3. You look for strengths in other people's solutions.
  4. When you criticize, it is "defects only," and not style points.
  5. You are ready for the next person in the door to have a great idea.
  6. You work with others to (re)combine ideas in pursuit of excellence.
I think these reminders work in parallel to whatever management hierarchy is in place.  In general, co-workers will respond in kind.  Now and then you get a guy stuck on his idea being best .. let him be, and of course try not to be that guy ;-)

Wednesday, December 28, 2011

Middle-aged borrowers piling on student debt

The full story is here.

It's interesting.  There are fields, of course, where formal education and debt are necessary.  And then there is computer programming, where Robert Speer, Eric Raymond, and I suggest you can learn for "free."  Well, at least for any of definition of "free" that includes a web connection and a spare PC.

I'm sure free-form learning on a web connected PC isn't for everyone, but I don't think the bar is that high.  You just need to think about your own learning plan, and then work at it patiently.

Rome wasn't built in a day.

Saturday, December 24, 2011

Alerntate Paths: via Eric Raymond

Eric Raymond won infinite geek points with his essay The Cathedral and the Bazaar.  It at once cataloged the Open Source dynamic and gave it direction.  Slightly less known is his document How To Become A Hacker.  It is worth reading in full, but one interesting bit is the ordering of his road map for "Basic Hacking Skills:"


1. Learn how to program.
2. Get one of the open-source Unixes and learn to use and run it.
3. Learn how to use the World Wide Web and write HTML.
4. If you don't have functional English, learn it.


That's a bit different than the order I suggest in my sidebar. I'm basically saying (using his numbers) do 2, then 3, then 1. Perhaps that's because I expect that people coming to my site have some small experience to programming and are committed to a long-term effort.

If you aren't sure, and are testing the waters, then I'm with Eric. Dabble with programming first, and then attack a software stack (like LAMP).

Friday, December 23, 2011

Alternate Paths: Processing

Wikipedia describes Processing as:

an open source programming language and integrated development environment (IDE) built for the electronic arts and visual design communities with the purpose of teaching the basics of computer programming in a visual context, and to serve as the foundation for electronic sketchbooks. The project was initiated in 2001 by Casey Reas and Benjamin Fry, both formerly of the Aesthetics and Computation Group at the MIT Media Lab. One of the stated aims of Processing is to act as a tool to get non-programmers started with programming, through the instant gratification of visual feedback. The language builds on the Java programming language, but uses a simplified syntax and graphics programming model.

It looks really good to me, as a first language, as does this Learning Processing site.

For someone looking for a first programming experience, and immediate graphic feedback, it looks pretty ideal.

Alternate Paths: JavaScript

In contrast to all the other computer languages I've discussed so far, JavaScript is a client-side language. It can run purely in a web browser, which makes initial tinkering pretty easy. Assuming some simple HTML chops, the student can show off some real programs pretty quickly. It can be done on any PC with a text editor and a web browser. JavaScript is a web standard. If you program long, you probably will want some JavaScript skills.

What's not to love? Well there is a pretty interesting discussion here at John Resig's blog. JavaScript is kind of a messy language, evolved over time to get things done in web pages. That makes it a little hard for me to endorse for beginners. As comments at John's page show though, people have learned JavaScript as their first programming language, and they endorse it.

JavaScript is also used at Codecademy to teach first-time programmers. There are many happy reports coming from Codecademy students as well.

So perhaps this is a good first-step approach for many. It doesn't start at the low levels I prefer, it kind of starts at the top of a web-programming stack, but if you like programming after a JavaScript exposure, you can branch back down.

Update: Alternate Paths: HTML5

Thursday, December 22, 2011

Should You vi?

When I was coming up through UNIX programming, GUI editors were not that common, and certainly not across the Sun, HP and IBM systems I commonly used.  On the other hand, vi was always there.  It's old-school.  It's infrastructure.

I'm going to say that yes, you should learn it if you are taking a Linux/UNIX centered development path.  There will be a time when you just need to quickly edit some dumb little text file, maybe over a telnet or ssh connection, and vi will do it.

Google "vi tutorial" and spend some time.  It might be fun, as well as a little frustrating ;-).  Just remember, when in doubt, pound that Esc key!

A few additional comments:

1) I run vi from the command line.  When I'm in a GUI mood I choose something else.

2) Whenever I load a new Linux system, I add the full vim package.  Vim is vi plus nice things like colored syntax highlighting.  When I can, I vim rather than vi.

3) Back in the old-school days there were "vi versus emacs" arguments (see Editor War).  I won't comment on that.  I ended up a "vi guy" alternately because I like a light environment, or I just happened to use vi first.

Don't Forget Exercise

In the NY Times article How Exercise Benefits the Brain we learn that this oft-reported claim has been tied to a mechanism:
For some time, scientists have believed that BDNF helps explain why mental functioning appears to improve with exercise. However, they haven’t fully understood which parts of the brain are affected or how those effects influence thinking. The Irish study suggests that the increases in BDNF prompted by exercise may play a particular role in improving memory and recall.
So, alternate that butt-in-chair time with a little time on the trails.  Not only does it feel good, it improves learning.

Alternate Paths: Java

Java is a fine computer language.  It currently finds application in devices ranging from cell phones, to enterprise commerce systems, to supercomputers.  By some measures it is the most popular programming language now in use.  For that reason it's probably fair to say Java is a language every serious programmer should learn, even if it is just to have a Java perspective.

That said, I'm not sure that it should be a "first language" in this day and age.  Java is a very formal and structured language, and requires some conceptual computer science thinking for efficient design and use.

Perhaps if you are in a CS curricula and Java is part of the course plan, you'll be fine.  I'm not so sure that it is as easy to just Google "java tutorial" and the "java web tutorial" and build it up on your own.

I'd say go with PHP (sidebar), or Python, or Ruby as a first language, and then come back to Java if-and-when you need it.

Update:  Greenfoot might offer a gentle Java introduction.

Alternate Paths: C++

Just say no!

I tried to like C++.  I really did.  I even bought Bjarne Stroustrup's book, "The Design and Evolution of C++."  I'm sorry.  That book just reads as an apology, a justification, for why C++ was such crap.

And C++ was bad.  It was the C successor that broke the C dynasty.  Apple went to Objective-C, a much better "Object C." Sun cleaned C++'s clock with Java, and when Microsoft did a fork, it was from Java to C#.

There was a time when C++ was more heavily supported, particularly as a Microsoft programming language, but that day is gone.  I don't think there is much of a need for advanced programmers to learn it, and beginners should avoid the horror.

Alternate Paths: Ruby

As mentioned previously, Ruby is a popular web-programming language.  There are many on-line resources for learning Ruby and its associated framework, Rails.

I think Ruby works well for a beginning programmer's first language.  It fills a niche similar to Python and shares many of the same strengths.  I agree with Luke Maciak at Terminally Incoherent that either of these two languages avoid the initial complexity of a strongly structured and typed language like C++ or Java.

So, sure.  Learning Ruby and then Rails is a perfectly valid path into programming.

You might Google some of the "Ruby versus Python" arguments before you begin, but as a first language it might not matter that much.  Both are great.

(I put Ruby and Python as both more "advanced" than PHP, but whether that means you should skip PHP, or learn it first, is up to you.  In my sidebar I assume the PHP path, as part of the traditional LAMP stack.)

Ruby Wins?

There is an interesting developer survey out, by BestVendor (hat tip David Strom). They do offer some caveats:
Let’s be clear that our sample selection is not representative of all developers. We pulled this data from 500+ early users of BestVendor who are developers. All work for companies with fewer than 100 employees, and the vast majority work in the startup-tech world. The fact that they signed up for the BestVendor beta suggests that they’re early adopters.
That said, the results are very interesting, and the most-loved tools do make a pretty good to-learn list for students of software development.

My first instinct was to look for "development language," which isn't there, but "framework" is, and we can deduce from that some languages information:

28% Ruby on Rails
11% Django
9% .Net
6% CodeIgniter
5% Spring

The first, Ruby on Rails, is a clear winner for the Ruby language.  Django is a Python framework.  The .Net would be mostly C#.  CodeIgniter is a PHP framework.  Finally, Spring is java.

It's really pretty amazing that in this pool the "most popular" programming language comes out 5th.  Not to mention that PHP, the "first language" recommended in my sidebar, comes out 4th.

Hmmm.  My meta-suggestion is that programmers keep one eye on which languages and technologies they love, and the other eye on where the market is heading.

Wednesday, December 21, 2011

Should You CLI?

In the beginning, computers were not really connected to users at all.  Programmers wired jumpers, and later fed stacks of cards.  When the connection came, it was with a line-oriented text interface.  First there were teletypes, and then there were CRT terminals.  The user typed, and the computer (programs) responded.  The user typed again, the computer responded again.  This command line interface (CLI) was in a very rudimentary sense "conversational."  Users couldn't ask anything ("sudo make me a sandwich") but if they learned the basic lingo of the computer, they could get a lot of work done.

Graphical user interfaces (GUIs) crept in, first on rare and expensive computers, but over time on everything down to a phone.  GUIs offer a more control-panel interaction.  It is look and click.  It is navigational.

There are many good reasons for programmers to be skilled at both modes.  A GUI has bandwidth and delivers massive amounts of information on a modern display.  On the other hand, the CLI conversation is a natural mode for performing a sequence of actions.

We can run a modern SQL database, like MySQL, from a GUI (or web-based) interface.  It makes it very easy.  On the other hand, there is no record or structure to the conversation.  When we connect to a database with a CLI client, we start conversing, and have a scroll-back history of every action performed.

When I connect as root to a production MySQL database, I do it with a CLI for this reason.  I can type once, and look twice, before hitting that sometimes scary "enter" key.

When I say "connect" I raise the second strength of the CLI.  It requires very low bandwidth and can be done with a telnet or ssh connection from one UNIX system anywhere in the world to another anywhere else in the world.  I've telneted across the office and (via a secure connection) to servers thousands of miles away.

You can do remote operations with GUIs, if they are set up, and if their crash isn't what you are trying to fix!  But the CLI will pretty much be there as long as a UNIX box is alive.  It is the ultimate fall-back, as well as a powerful tool for daily operations.

So yes, I'd say you should CLI (as well as GUI), but by all means Google "CLI versus GUI" for more opinions!

When you hit steps 4. Learn UNIX Basics and 9. Learn MySQL Basics value those CLI lessons.

True Names

When I began work, programmers typed their resumes on paper and mailed them (in trucks!) to prospective employers.  Once there, the resumes were read (or at least skimmed) by a human being before being handed up to managers.  In those days our online persona (such as they were) were usually separate and distinct from our real self.  There were individuals who piloted on-line persona with their True Names and built a personal branding on that basis.  They were rare, but it changed over time.  There have been a lot of incremental changes, with job sites, personal web pages, and ultimately LinkedIn.

I think that if I were beginning today, trying to build a working reputation as a programmer, I'd do it with my True Name.  There's an old saying from business that "every customer contact is a sales opportunity."  In the web, as we grow, learn, and network, every contact is an opportunity.

As you build points and badges at programmer's forums, you build a rep.  It's probably better do start that now under a True Name.

How you integrate that, or separate that, from a social persona on Facebook or something ... that might be a harder problem.  Luckily, I'm too old to worry about it.

Egoless Boots

How did I name this thing? Well, never fault a dot-com name that is simply available, but beyond that, I want this to be about bootstrapping on an egloless path.

Bootstrapping is an old word. It refers to pulling oneself up by one's own boot-straps. The phrase made the jump to computing sometime in the 1950s and has stuck. It generally means starting small and working your way up. I hope to provide one path for "pulling oneself up" into computer programming, using the resources of the web.

"Egoless" might seem a strange word to add, but I think it's important. It refers to Egoless Programming. The idea is that, as much as possible, we should keep our egos out of it and just pursue the best answer. When two programmers trade ideas, it should be about what's best for the user at the end of the day, and not just "mine's better." Having that attitude makes us better students, and teachers as the years go by.

If that sounds good, continue on to my sidebar

Tuesday, December 20, 2011

Resources: YouTube

In my sidebar I emphasize Google as the search engine of choice.  When we reach Step Four, Learn UNIX Basics, I suggest you Google it (as "learn unix basics").  That works, and it is my standard technique, but sometimes I go to YouTube instead.  The YouTube search (again, "learn unix basics") brings up a basket full of results.

If you are a visual type, or just want a break from surfing and skimming, a video can work wonders.  Ultimately the style decision is all yours.  When you are ready to learn HTML basics, or advanced HTML, you can Google a tutorial, or watch a YouTube video, or both.

There are amazing resources out there.

Alternate Paths: Lisp

Lisp is an ancient computer language, born in 1958.  It has retained a following and respect for the last 50-plus years, particularly in the artificial intelligence community.

Vladimir Sedach suggests that:

Common Lisp is the best language to learn programming

I can see strengths and weaknesses in the approach.  Lisp as highly regarded as a language, but doesn't have a tremendous job market.  It might be very good to develop core skills, but I suspect that after learning Lisp students would look for a more common and marketable skill set.

I'd welcome comments from anyone who started with Lisp first.

Cognitive Surplus and Walled Gardens

The phrase cognitive surplus describes the idle capacity that people have available to engage in collaborative activities, especially in building and sharing knowledge on the web.  Wikipedia is often cited as the prime example of what cognitive surplus can do.

This site represents my cognitive surplus.

In tension with this is the idea of a walled garden.  A walled garden is an entity, sometimes a web site, that encourages users to stay withing its borders.  Commercial vendors have an interest in capturing cognitive surplus to expand their gardens and make them more attractive destinations.

I'm an outsider on edu-hacking, and the future of education, but I think there is a clear competition going on now between the network of "sites without walls" and those more aggressively pursuing "walled garden" status.

I would bet long-term on the open systems, but if I'm going to be "egoless" on this too, I should say it's all good.  If an ed-tech business can help you learn, and provide decent ROI, go for it.  Of course, you might browse for the free and open alternatives.

Monday, December 19, 2011

Robert Speer Recommends a Similar Path

This post from December 16 came just as I was typing up my own recommendations:

How to get into Web Development with NO degree and NO debt

Robert emphasizes career building and jobs getting more than I.  Actually in the sidebar I don't talk about those at all.  My assumption was that as you make the climb through the LAMP stack you'd get the lay of the land, jobs-wise.

I'm 100% with Robert that the way to demonstrate skill is just that, to demonstrate skill.  If you create your own website, from scratch, and can describe your methods, you have a good presentation for any prospective employer.

People who just bolt together pieces they don't really understand will not fare so well.

(I plan a future post on the whole "badging" phenomenon.)

Two Families

When I started programming, in the late 70's and early 80's, it was common for both programming languages and operating systems to pass away, and to be supplanted.  At all levels of computing, from desktops to mainframes, system software would enjoy a few years in the sun, and then fade.

What's really interesting is that changed, something happened to break the dynamic nature of the market.  I think it was just the sheer number of users who arrived with IBM PCs and who settled on UNIX for back-office systems.  When it was a few thousand programmers, they were a mobile pool, and seduction to a new standard was possible.   With a few million programmers the equation changed.  Suddenly the standard had a huge weight.

And so we are left with the two surviving families, Windows and UNIX, into the future.  (I lump Apple and Linux into the UNIX family.)  They are infrastructure now, and might last a really long time.  Other curious standards, like wall voltage, and the railroad gauge, were set a long time ago.  So it could be with these.

We are moving to the cloud now a bit, and that might seem different, but it is just an abstraction layer.  As I understand it, essentially all cloud servers are running UNIX, and those few that aren't, are running a Windows variant.

So, I think my sidebar recommendation to bootstrap the LAMP stack is a good one.  It's infrastructure, and will be slow to change.

Alternate Paths: Arduino



The Arduino (wikipedia, arduino.cc) is a little hobby and prototyping board.  It is programmable, but doesn't normally drive a screen or connect to the internet (though, it can).  The typical use is as a playground for simple programming and interfacing to the real world.

In my sidebar I'm big on Google searches for tutorials.  Search "arduino tutorial" and you'll see many, wonderful, things.

It provides a perfectly acceptable path to learn computer programming.  In terms of the "solution space" it provides ... well, you'll be able to do many small projects around the house, and you may join the Arduino ecosystem as a hardware or software developer.  There is a good argument that "the internet of things" is a big, coming, wave.

So, it may be a good fit for you.

Sunday, December 18, 2011

Alternate Paths: Python

In my sidebar I take you through the LAMP stack.  That is a bottoms-up approach, with a lot of learning along the way.  If it isn't a world tour of programming, it is at least a solid road trip.

But if you just want to program, quickly, it's hard to beat Python, and in particular the Dive into Python resource.

The strength of it is that you'll do some programming soon, and get a feel for what the activity is all about.  You'll get to see how much you like sitting with your butt in a chair, trying to make things work.  You'll learn whether the intermittent triumphs make it all worth-while.

The downside is that knowing just Python doesn't buy you a huge solution domain.  Yes, you can write small programs, and they may be useful to you, but it's hard to deliver pure-Python to other users.  You either have to embed them in a web page (as in LAMP, above) or make a full blown program, with installer, for a target machine.

On the other hand, LAMP is used on millions of web servers world-wide, and any LAMP skills you have will play across all of them.

Perhaps you should Dive into Python, and then if you like it, go for the full LAMP tour.

Top 10 Ed-Tech Trends

Audrey Watters at Hack Education has given her Top 10 Ed-Tech Trends of 2011. My favorites are the pairs which are in conflict:

Khan Academy (6) versus The Higher Education Bubble (8)

and

Open (9) versus The Business of Ed-Tech (10)

I'll side with Khan and Open. Indeed it seems that in any world with cognitive surplus, education should become easier, cheaper, and more common.  That's what my sidebar is all about.

Ten Years?

Peter Norvig, Director of Research at Google, wrote a pithy web page called:

Teach Yourself Programming in Ten Years

It is a reaction to all the "Learn Foo in 7 Days" books we see in bookstores.  Personally, I always took those titles as a challenge.  If they said "7 Days" I'd think I could do it in 2.

I tried that as an interview question for a while, "If you saw a book that said 'in 7 Days' how long do you think it would take you?"  Some thought that was a mean question, but I think it's good for a programmer to have some confidence.

In my sidebar I say:

There are many guesses about how long it should all take. I'd say you can be writing simple web programs in a few weeks, be turning out solid work in about a year, and be an expert in a few more. That's assuming you really get into it.

I guess the hedge there is "assuming you really get into it."

But still, if you do get into it, you should develop your independent learning ability, and scoff at "7 days."

Howard Lindzon writes ...

The smartest worriers are learning to code or marrying a developer.

It's an interesting article spanning venture capital, web dynamics, and the future of education.

It makes yesterday's effort, setting up the "Computer Programming" sidebar, seem worthwhile.

Saturday, December 17, 2011

Hello World

I have been programming computers and have been on-line in various forms for the last 30 years.  I've watched on-line learning evolve.  Early programmers would fend for themselves, and share as they could.  Lately we've had break-out successes for more general audiences like Kahn Academy.

I find the evolution fascinating, and read sites like Hack Education with great interest.

There was one page at Hack Education that set me back though, it was this story on the state of learning for computer programming:

Codecademy and the Future of (Not) Learning to Code

Apparently, while there are many HOWOs and Tutorials on the web, students aren't finding a framework that puts them all together.  So, I took a couple days and typed one up.  It's there in the side-bar, in 12 (hard?) steps.  The first section describes my method:

0.  Learn Computer Programming

As I say, I offer just one approach, it may work for you.  Have fun.