Free Education (As In Beer)

Recently I gave a talk about how to obtain a free university education at a conference in Brazil, and it was well received, so I thought I would blog about it here.


I have known several young people who have done very well for themselves in computer science without having a university degree, or if they did have a degree it was not in computer science. All of these people credited the availability of Free and Open Source Software (FOSS) in their software training. In my own career, I first learned how to program by reading a book and practicing. Later I taught myself how to program in assembler/machine language the same way.


In my talk, the first point that I make is that a university education is not about “being trained for a job”. “Job training” might happen with vocational training in high school, but in my opinion the real goal of a college education is to train someone how to learn on their own, without having a “teacher” tell them the information, or even what information they need to know.


Professors in universities are fairly up-front in saying “I do not have the time to tell you everything, so there is the library and there is the Internet, here are some journals and here you may find interesting people to interview and discuss things with...” After that, it is up to the student to locate the data on the topic at hand, and to sift through all the data to find the information that is both true and pertinent.


Therefore the university should be teaching networking principals, not “Cisco”; it should be teaching how to manage your business with office products, not “Microsoft Office”; database structure, design and choice, not “Oracle”. There is nothing wrong with being introduced to these products during this education process, but learning these products should be secondary in the course, used as an example of the underlying material.


The second main point that I make is around “depth” of education. I believe in teaching fundamentals, and allowing the student to build on those. Therefore in a computer science education I believe that students should not only learn one or two assembly/machine languages, but should also build a simple flip-flop, register, and study a block level diagram of a modern computer, along with its bus structure, cache placement and utilization, and how peripherals such as a disk, tape and flash are put together. It is not enough to learn JAVA. Modern-day hardware and operating systems do a good job of hiding some of the issues around hardware, but understanding the relative speeds of the various forms of “memory” in a computer (including network latencies) might save a future software engineer from writing a really horrendous program, even if they are writing it in JAVA.


In my early days of programming, I was often given the job of taking a program that was “mysteriously” slow and making it run in one half, one quarter or even one two-hundredths of the time. The last one may be hard for people to believe, but a program that ran in 10.5 hours on a PDP-11/70. I re-designed (and a freshman student re-wrote) the program to run in three minutes, relying on my knowledge of computer architecture and having the most active parts of the program and data stay in cache.


I believe that by teaching students to this fundamental level, that few things will be a “black box” to them in the future, and that they will be able to figure out how most new things work, at least to a level useful to their needs.


Next I often talk about the different sub-categories of education at the university level.


I was lucky enough to attend Drexel University in Philadelphia. Drexel was a university that believed strongly in co-operative (co-op) education. Studying to be an electrical engineer in 1969, I was also fortunate to have a co-op period with the Western Electric Company (the manufacturing arm of the Bell System) in Baltimore, Maryland. It was during this first co-op period that I signed up for a correspondence course through the Bell System called “How to program the IBM 1130 in FORTRAN”. This course ignited a life-long love affair with computers.


The co-op session was two-edged, however. It also convinced me that I might not be as interested in being an electrical engineer as I thought I would, and with computers pulling me and elements of electrical engineering pushing me away, I switched directions. Co-op can help formulate your path before you graduate university by allowing you to see what people in that field really do. Co-op also gave me needed funds for paying my college expenses, and let me see how big industry really worked.


Another path in education is the “guild” program. Many years ago in England a program was set up for educating people to a job. A person started as an apprentice to a master craftsman, doing simple jobs for them, both learning the craft and getting a small salary. Over time the apprentice learned enough to go out on their own and become a “Journeyman”, and eventually learned enough and was skillful enough to become a “Master Craftsman”.


In a lot of places the university has free (or very low) tuition, but even if tuition is free some people can not attend. These people need to work to earn money to support themselves and/or their family.


An apprenticeship program can be set up where the person works for a period of the week, receiving wages from a company, but takes courses for a portion of the week, moving toward their university education. The employer eventually ends up with an educated employee who can apply their education to the company, the person ends up with their degree, and the country ends up with an educated citizen....a win-win-win situation.


Finally there is self-study and mentorship programs. Not everyone has the capability of learning completely on their own, but with a few questions asked of a mentor, some people can learn a lot.


The amount of free data on the Internet is without precedent in history. Not only do we have structured collections like Project Gutenberg, but we also have efforts like MIT and Khan Academy as well as other academic sites that are putting great educational materials on the Internet for free.


How do you get started?


I suggested to the students that they go to a university site and find the degree they are interested in pursuing. Then find the course curriculum listings for that degree. This will help the potential student figure out what information should be learned in a particular order. For example, it is hard to read and understand a high-level physics book if you do not have the mathematics background to help you understand it, so you may have to study mathematics before reading about physics. In this case the mathematics is a “prerequisite” of the physics. Usually the curriculum guide points out the prerequisites of a course.


Once you know the courses you need and the order to take them, you then find out what books are used for each course. Usually the web sites of the universities also tell you the book lists for the courses. Sometimes you have to search or dig a little to find this, but usually you can find the book titles and authors, or a list of “suggested reading”.


Of course books cost money, but usually you can find them online, and buying a slightly older edition can save you a LOT of money without losing any real amount of information. I bought a book on business law that normally cost over 100 dollars for fifteen dollars because it was used and one edition out of date.


Now you can start reading, and while you read you can also search the Internet for other writings on that topic. Perhaps you can find a forum of people who are talking about that topic, and after reading some of the forum entries (to make sure you do not ask a question already answered), you can ask a question about it. The people in the forum become your classmates and your mentors.


Do the exercises in the back of the books, both the ones with answers and those with no answer.


Not just “Learning Linux”


If you are trying to learn operating system design, of course you can use the GNU/Linux system as an example. After all, it is used on 98% of the biggest, fastest computers in the world today, is the most-used operating system in embedded system design and is shipping on many server systems. Of course Android uses the Linux kernel too, so the Linux Kernel is probably one of the most used kernels in the world. There are also many “open” operating systems other than GNU/Linux.


FreeDOS is a re-implementation of the MSdos system, binary compatible with the original. It is a simpler operating system, and a good place to start the study of operating systems.


In addition to the Linux kernel, there are the *BSD kernels (FreeBSD, OpenBSD and NetBSD, Mach (a micro-kernel from Carnegie Mellon University and the basis of Mac OS X), and the GNU Hurd (also a micro-kernel).


If you are interested in designing file systems, a wide range of file system types are supported, as well as almost every type of network protocol, from TCP/IP to Bluetooth.


Interested in computer languages? Almost every language I have ever experienced has a FOSS version available, including all the scripting languages used for web design.


If you are studying database design, go to and find the databases that are there. Look at the source code for those databases and see how they work. The same thing for operating system design, compiler design, and other courses.


Speaking of Web design, both Firefox and Apache are FOSS, as well as a lot of code for doing VoIP, such as Asterisk.


Interested in learning graphic design or animation? Tools like GIMP, Inkscape and Blender may not be mainstream in those businesses, but you can learn the underlying techniques and apply those techniques to a different tool later.


You can also join various Free Software Projects and donate your time and expertise to them. Find a project that you wish to contribute to and read their mailing lists a while to see what needs to be done. Usually you start with bug fixes or quality control testing, and as you become better at coding and better known by the team, you will move into creating new features.


Even if you are not studying Computer Science you can contribute to various projects. Perhaps you can write or translate documentation, or simply review documentation for clarity. These tasks not only help the project, but they also help your understanding of the subject matter. I can honestly say that there have been topics where I had an incomplete understanding until I actually had to teach those topics to someone else. Likewise writing, reviewing and translating documentation goes a long way to really learning something.


For example, if you are a business major, you might read the documentation on an ERP system, and if that ERP documentation is not clear in how to set up the software, or how it works, you could suggest changes to the documentation. You might also suggest needed improvements to the software to fit the needs of business. Be careful, however, since too many “suggestions” at one time may gain the response of “great idea....why don't you write the code” and you may not be ready for that.


Another way of learning is to teach something to someone else. If you are good at learning by reading books and practicing on your own, cement the topic in your mind by volunteering to do a presentation on it. Teaching this class or course will also look nice in your portfolio.




Besides education, the typical university also does “certification”. When you think about it, the diploma that you get at the end is a “certification” that you went to the university, studied a certain number of courses, and satisfied your professors that you have retained a certain amount of knowledge and could use it.


In a lot of ways a paper certification like a diploma is like paper money. The certification only has worth due to the confidence that the public has in it. A certification that is too easy to get, or does not properly test the student rapidly loses its value.


Good universities are accredited by various accreditation agencies to make sure that they maintain high standards of training and certification.


For more targeted studies, such as being a Linux systems administrator, there are certification programs such as the Linux Professional Institute ( LPIs certifications are developed through input from people in the field, and rigorously tested for completeness and correctness. They maintain a high level of “confidence”.  LPI also lists the objectives for each level of certification, so you can use these objectives as the path for study.


However, in a lot of cases a certification is not enough to get a job. It is an advantage, and particularly when the hiring person does not know enough about the technology to ask good questions. Or if the person having the certification is working as either an independent consultant or a consultant in a company with other consultants. To be able to say that 100% of the consultants have at least one certification, and that a large majority of the consultants have higher-level certifications is typically good for the company as a whole.


Another proof of knowledge that you may have is your resume, or Curriculum Vitae (CV). That lists your talents and achievements and allows the prospective employer to see if you have the skills that they need for a particular job.


A third type of “certification” is the letters of recommendations that you might get from your previous employers and fellow workers.


The Portfolio


As you do your work, keep a portfolio, soft copy of all your work, and hard copy of things you are particularly proud. This will include magazine articles and books that you have written and talks that you have given, even if only for your own local user groups.


You will be able to show this portfolio later to perspective employers as proof of your work.


Lab Equipment


When I started in computer science in 1969, even the smallest of computers were hundreds of thousands of dollars. However today you can use a cast-off desktop or notebook for almost any computer science task in the world. Your computer may not be the fastest or have the greatest capacity, but even recycled computers today have all of the capability that a computer science student needs.


If I was to look for a new computer for education today, I would look for a CPU that is 64-bit and supports virtualization, with a graphics card that supports 3D, hopefully from a vendor that is open with its device drivers. The CPU does not have to be the fastest, not the 3D the “hottest”, but it should support these basic options.


With this one system you can start several virtual machines and set up “networking” between them, then practice programming a “High Performance Computer” (HPC), all on the same notebook.


With a few cast-off desktop computers you could practice setting up a highly-available server, or a small “cluster”.


Virtualization and emulators have changed the method of education too. Copies of ancient (but still interesting) operating systems are now available over the Internet and can be run on emulators of ancient (but still interesting) hardware.


Want to learn more about hardware? The Arduino and the Raspberry Pi are very low-cost computers with many “projects” online that can help you learn about digital electronics. If you can not afford these units yourself, perhaps a friend and you can split the cost. It is actually more fun to work on these with someone else than it is by yourself.


You can also join or initiate a Hackerspace. Here you can share the equipment that you might need for an education. For that matter, you might find some friends who want to study with you at the Hackerspace, and studying together is usually more fun.


Are you telling me not to go to university?


No. Even though I feel a “university education” can be obtained these days without going to a university, I believe that my university days were some of the best in my life. To be put into an environment that is totally aimed at learning, whether it be base knowledge or how to get along with other people, was worthwhile to me. If you have the chance to go, try it out.


For those people, however, that can not afford to go to university, I have put forth a way that you can get the same knowledge, and even a certain part of the certification.




Take advantage of the free materials on the Internet. Set a goal of what you want to learn, then utilize the resources out there to educate yourself.


After you have gained the information, you may wish to get certification through a program like LPI.


- Jon "maddog" Hall -