-
-
Save tml/3873804 to your computer and use it in GitHub Desktop.
Because you shouldn't have to put up with profanity...
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
to get a list of free programming books, here's the list from a Zed Shaw & Co. programming-related, profanity-filled website. | |
<div style="text-align: left"> | |
<table> | |
<tbody><tr><th colspan="3">Programming Languages</th> | |
</tr><tr> | |
<td><a href="#Assembly Language">Assembly Language</a></td> | |
<td><a href="#Bash">Bash</a></td> | |
<td><a href="#C / C++">C / C++</a></td> | |
</tr> | |
<tr> | |
<td><a href="#C#">C#</a></td> | |
<td><a href="#Clojure">Clojure</a></td> | |
<td><a href="#ColdFusion">ColdFusion</a></td> | |
</tr> | |
<tr> | |
<td><a href="#Delphi / Pascal">Delphi / Pascal</a></td> | |
<td><a href="#Erlang">Erlang</a></td> | |
<td><a href="#F#">F#</a></td> | |
</tr> | |
<tr> | |
<td><a href="#Forth">Forth</a></td> | |
<td><a href="#Haskell">Haskell</a></td> | |
<td><a href="#HTML / CSS">HTML / CSS</a></td> | |
</tr> | |
<tr> | |
<td><a href="#Java">Java</a></td> | |
<td><a href="#JavaScript">JavaScript</a></td> | |
<td><a href="#Latex">Latex</a></td> | |
</tr> | |
<tr> | |
<td><a href="#Lisp">Lisp</a></td> | |
<td><a href="#Lua">Lua</a></td> | |
<td><a href="#Nemerle">Nemerle</a></td> | |
</tr> | |
<tr> | |
<td><a href="#Oberon">Oberon</a></td> | |
<td><a href="#Objective-C">Objective-C</a></td> | |
<td><a href="#OCaml">OCaml</a></td> | |
</tr> | |
<tr> | |
<td><a href="#Oracle PL/SQL">Oracle PL/SQL</a></td> | |
<td><a href="#Parrot / Perl 6">Parrot / Perl 6</a></td> | |
<td><a href="#Perl">Perl</a></td> | |
</tr> | |
<tr> | |
<td><a href="#PHP">PHP</a></td> | |
<td><a href="#PowerShell">PowerShell</a></td> | |
<td><a href="#Prolog">Prolog</a></td> | |
</tr> | |
<tr> | |
<td><a href="#Python">Python</a></td> | |
<td><a href="#R">R</a></td> | |
<td><a href="#Ruby">Ruby</a></td> | |
</tr> | |
<tr> | |
<td><a href="#Scala">Scala</a></td> | |
<td><a href="#Scheme">Scheme</a></td> | |
<td><a href="#Smalltalk">Smalltalk</a></td> | |
</tr> | |
<tr> | |
<td><a href="#SQL">SQL</a></td> | |
</tr> | |
<tr><th colspan="3">Frameworks</th></tr> | |
<tr> | |
<td><a href="#ASP.NET MVC">ASP.NET MVC</a></td> | |
<td><a href="#Django">Django</a></td> | |
<td><a href="#Flex">Flex</a></td> | |
</tr> | |
<tr> | |
<td><a href="#Grails">Grails</a></td> | |
<td><a href="#.NET">.NET</a></td> | |
<td><a href="#Ruby on Rails">Ruby on Rails</a></td> | |
</tr> | |
<tr><th colspan="3">Tools</th></tr> | |
<tr> | |
<td><a href="#DB2">DB2</a></td> | |
<td><a href="#Git">Git</a></td> | |
<td><a href="#Linux">Linux</a></td> | |
</tr> | |
<tr> | |
<td><a href="#Maven">Maven</a></td> | |
<td><a href="#Mercurial">Mercurial</a></td> | |
<td><a href="#NoSQL">NoSQL</a></td> | |
</tr> | |
<tr><td><a href="#Oracle Server">Oracle Server</a></td> | |
<td><a href="#PostgreSQL">PostgreSQL</a></td> | |
<td><a href="#Subversion">Subversion</a></td> | |
</tr><tr> | |
<td><a href="#Vim">Vim</a></td> | |
<td><a href="#Emacs">Emacs</a></td> | |
</tr> | |
<tr><th colspan="3">General Topics</th></tr> | |
<tr> | |
<td><a href="#Graphics Programming">Graphics Programming</a></td> | |
<td><a href="#Language Agnostic">Language Agnostic</a></td> | |
</tr> | |
</tbody></table> | |
<h3><a name="Graphics Programming">Graphics Programming</a></h3> | |
<ul> | |
<li><a href="http://http.developer.nvidia.com/GPUGems/gpugems_part01.html">GPU Gems</a></li> | |
<li><a href="http://http.developer.nvidia.com/GPUGems2/gpugems2_part01.html">GPU Gems 2</a> - <a href="ftp://download.nvidia.com/developer/GPU_Gems_2/">ch 8,14,18,29,30 as pdf</a></li> | |
<li><a href="http://http.developer.nvidia.com/GPUGems3/gpugems3_part01.html">GPU Gems 3</a></li> | |
<li><a href="http://www.gamedev.net/reference/articles/article1698.asp">Graphics Programming Black Book</a></li> | |
<li><a href="http://tog.acm.org/resources/shaderx/">ShaderX series</a></li> | |
<li><a href="http://www.xmission.com/~legalize/book/download/index.html">DirectX manual</a> (draft)</li> | |
<li><a href="http://www.arcsynthesis.org/gltut/">Learning Modern 3D Graphics Programming</a> (draft)</li> | |
</ul> | |
<h3><a name="Language Agnostic">Language Agnostic</a></h3> | |
<ul> | |
<li><a href="http://scg.unibe.ch/download/oorp/">Object-Oriented Reengineering Patterns</a></li> | |
<li><a href="http://codebetter.com/files/folders/codebetter_downloads/entry179694.aspx">Foundations of Programming</a></li> | |
<li><a href="http://scpd.stanford.edu/knuth/index.jsp">Computer Musings</a> (lectures by Donald Knuth)</li> | |
<li><a href="http://www.catb.org/esr/writings/cathedral-bazaar/">The Cathedral and the Bazaar</a></li> | |
<li><a href="http://www.codeplex.com/AppArchGuide">Patterns and Practices: Application Architecture Guide 2.0</a></li> | |
<li><a href="http://www.cl.cam.ac.uk/~rja14/book.html">Security Engineering</a></li> | |
<li><a href="http://www.dspguide.com/">Digital Signal Processing For Engineers and Scientists</a></li> | |
<li><a href="http://gettingreal.37signals.com/">Getting Real</a></li> | |
<li><a href="http://www.infoq.com/minibooks/domain-driven-design-quickly">Domain Driven Design Quickly</a></li> | |
<li><a href="http://homepage.mac.com/s_lott/books/oodesign.html">OO Design</a></li> | |
<li><a href="http://smartbear.com/codecollab-code-review-book.php">Best Kept Secrets of Peer Code Review</a></li> | |
<li><a href="http://www.scribd.com/doc/7181362/NASA-Software-Measurement-Guidebook">NASA Software Measurement Handbook</a></li> | |
<li><a href="http://homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-manage.pdf">NASA Manager Handbook for Software Development</a> (PDF)</li> | |
<li><a href="http://www.cl.cam.ac.uk/teaching/Lectures/funprog-jrh-1996/">Introduction to Functional Programming</a> (class lectures and slides)</li> | |
<li><a href="http://www.htdp.org/">How to Design Programs</a></li> | |
<li><a href="http://www.computer.org/portal/web/swebok">Guide to the Software Engineering Body of Knowledge</a></li> | |
<li><a href="http://ocw.mit.edu/OcwWeb/web/home/home/index.htm">Online Course Materials</a></li> | |
<li><a href="http://www.cs.berkeley.edu/~vazirani/algorithms.html">Algorithms</a> (draft)</li> | |
<li><a href="http://dotnetslackers.com/projects/Data-Structures-And-Algorithms/">Data Structures and Algorithms</a></li> | |
<li><a href="http://www.agileskills.org/download.html.en">Essential Skills for Agile Development</a></li> | |
<li><a href="http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/">Programming Languages: Application and Interpretation</a></li> | |
<li><a href="http://pine.fm/LearnToProgram/">Learn to Program</a></li> | |
<li><a href="http://www.dreamsongs.com/Files/PatternsOfSoftware.pdf">Patterns of Software: Tales from the Software Community</a> (PDF)</li> | |
<li><a href="http://mindprod.com/jgloss/unmain.html">How to write Unmaintainable Code</a></li> | |
<li><a href="http://catb.org/esr/writings/taoup/html/">The Art of Unix Programming</a></li> | |
<li><a href="http://nexus.realtimepublishers.com/dgbcq.php">The Definitive Guide to Building Code Quality</a></li> | |
<li><a href="http://openbookproject.net/thinkcs/">How to Think Like a Computer Scientist</a> </li> | |
<li><a href="http://planning.cs.uiuc.edu/">Planning Algorithms</a></li> | |
<li><a href="http://www.ii.uib.no/~michal/und/i227/book/book.pdf">Mathematical Logic - an Introduction</a> (PDF)</li> | |
<li><a href="http://www.cse.ohio-state.edu/~gurari/theory-bk/theory-bk.html">An Introduction to the Theory of Computation</a></li> | |
<li><a href="http://devshaped.com/book">Developers Developers Developers Developers</a> (broken download link?)</li> | |
<li><a href="http://www.iecc.com/linker/">Linkers and loaders</a></li> | |
<li><a href="http://www.stack.nl/~marcov/compiler.pdf">Let's Build a Compiler</a></li> | |
<li><a href="http://producingoss.com/">Producing Open Source Software</a></li> | |
<li><a href="http://www.lindaspaces.com/book/">How to Write Parallel Programs</a></li> | |
<li><a href="http://www.neildavidson.com/dontjustrollthedice.html">Don't Just Roll the Dice</a></li> | |
<li><a href="http://programmer.97things.oreilly.com/">97 Things Every Programmer Should Know</a></li> | |
<li><a href="http://www.fastchip.net/howcomputerswork/p1.html">How Computers Work</a></li> | |
<li><a href="http://nlp.stanford.edu/IR-book/information-retrieval-book.html">Introduction to Information Retrieval</a></li> | |
<li><a href="http://kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html">Is Parallel Programming Hard, And, If So, What Can You Do About It?</a></li> | |
<li><a href="http://www.jjj.de/fxt/#fxtbook">Matters Computational</a></li> | |
<li><a href="https://www.cs.kent.ac.uk/people/staff/sjt/TTFP/">Type Theory and Functional Programming</a></li> | |
<li><a href="http://public.dhe.ibm.com/software/dw/db2/express-c/wiki/Getting_started_with_open_source_development_p2.pdf">Getting started with Open source development</a> (PDF)</li> | |
<li><a href="http://public.dhe.ibm.com/software/dw/db2/express-c/wiki/Database_fundamentals.pdf">Database Fundamentals</a> (PDF)</li> | |
<li><a href="http://www.cleveralgorithms.com/nature-inspired/index.html">Clever Algorithms</a></li> | |
<li><a href="http://domaindrivendesign.org/sites/default/files/discussion/PatternSummariesUnderCreativeCommons.doc">Summary of the GoF Design Patterns</a></li> | |
<li><a href="http://jpaulmorrison.com/fbp/#book">Flow based Programming</a></li> | |
<li><a href="http://www-old.oberon.ethz.ch/WirthPubl/AD.pdf">Algorithms and Data-Structures</a> (PDF)</li> | |
<li><a href="http://www-old.oberon.ethz.ch/WirthPubl/CBEAll.pdf">Compiler Construction</a> (PDF)</li> | |
<li><a href="http://www-old.oberon.ethz.ch/WirthPubl/ProjectOberon.pdf">Project Oberon</a> (PDF)</li> | |
<li><a href="http://greenteapress.com/semaphores/">The Little Book of Semaphores</a></li> | |
<li><a href="http://elliottback.com/wp/essential-skills-for-agile-development/">Essential Skills for Agile Development</a></li> | |
<li><a href="http://www.amibug.com/iamabug/p01.html">I Am a Bug</a></li> | |
<li><a href="http://infolab.stanford.edu/~ullman/mmds.html">Mining of Massive Datasets</a></li> | |
<li><a href="http://www.umiacs.umd.edu/~jimmylin/MapReduce-book-final.pdf">Data-Intensive Text Processing with MapReduce</a> (PDF)</li> | |
<li><a href="http://www.apnic.net/__data/assets/pdf_file/0020/8147/501302.pdf">Understanding IP Addressing: Everything you ever wanted to know</a> (PDF)</li> | |
<li><a href="https://gustavus.edu/mcs/max/os-book/">Operating Systems and Middleware</a> (PDF and LaTeX)</li> | |
<li><a href="http://greenteapress.com/thinkstats/" title="Think Stats: Probability and Statistics for Programmers">Think Stats: Probability and Statistics for Programmers</a> (PDF, code written in Python)</li> | |
<li><a href="http://www.aosabook.org/en/index.html">The Architecture of Open Source Applications</a></li> | |
</ul> | |
<h3><a name="ASP.NET MVC">ASP.NET MVC</a></h3> | |
<ul> | |
<li><a href="http://weblogs.asp.net/scottgu/archive/2009/03/10/free-asp-net-mvc-ebook-tutorial.aspx">NerdDinner Walkthrough</a></li> | |
</ul> | |
<h3><a name="Assembly Language">Assembly Language</a></h3> | |
<ul> | |
<li><a href="http://download.savannah.gnu.org/releases/pgubook/ProgrammingGroundUp-1-0-booksize.pdf">ProgrammingGroundUp</a> (PDF)</li> | |
<li><a href="http://drpaulcarter.com/pcasm/">Paul Carter's Tutorial on x86 Assembly</a></li> | |
<li><a href="http://www.agner.org/optimize/">Software optimization resources by Agner Fog</a></li> | |
</ul> | |
<h3><a name="Bash">Bash</a></h3> | |
<ul> | |
<li><a href="http://tldp.org/LDP/abs/html/">Advanced Bash-Scripting Guide</a></li> | |
<li><a href="http://mywiki.wooledge.org/BashGuide">Lhunath's Bash Guide</a></li> | |
</ul> | |
<h3><a name="C / C++">C / C++</a></h3> | |
<ul> | |
<li><a href="http://www.knosof.co.uk/cbook/cbook.html">The new C standard - an annotated reference</a></li> | |
<li><a href="http://www.jjj.de/fxt/fxtbook.pdf">Matters Computational: Ideas, Algorithms, Source Code, by Jorg Arndt</a></li> | |
<li><a href="http://publications.gbdirect.co.uk/c_book/">The C book</a></li> | |
<li><a href="http://www.mindview.net/Books/TICPP/ThinkingInCPP2e.html">Thinking in C++, Second Edition</a></li> | |
<li><a href="http://cppannotations.sourceforge.net/">C++ Annotations</a></li> | |
<li><a href="http://www.agner.org/optimize/">Software optimization resources by Agner Fog</a></li> | |
<li><a href="http://cartan.cas.suffolk.edu/oopdocbook/opensource/index.html">Introduction to Design Patterns in C++ with Qt 4</a> (<a href="http://www.informit.com/store/product.aspx?isbn=0131879057">PDF</a>)</li> | |
<li><a href="http://www.planetpdf.com/codecuts/pdfs/ooc.pdf">Object Oriented Programming in C</a> (PDF)</li> | |
<li><a href="http://beej.us/guide/bgnet/">Beej's Guide to Network Programming</a></li> | |
<li><a href="http://c.learncodethehardway.org/book/">Learn C the hard way</a></li> | |
<li>Also see: <a href="http://stackoverflow.com/q/388242/511601">The Definitive C++ Book Guide and List</a></li> | |
</ul> | |
<h3><a name="C#">C#</a></h3> | |
<ul> | |
<li><a href="http://www.programmersheaven.com/2/CSharpBook">C# School</a> (covers C# 1.0 and 2.0)</li> | |
<li><a href="http://www.albahari.com/threading/">Threading in C#</a></li> | |
<li><a href="http://www.csharpcourse.com/">C# Yellow Book</a> (intro to programming)</li> | |
<li><a href="http://en.wikibooks.org/wiki/C_Sharp_Programming">C# Programming - Wikibook</a></li> | |
<li><a href="http://www.techotopia.com/index.php/C_Sharp_Essentials">C# Essentials</a></li> | |
<li><a href="http://www.brpreiss.com/books/opus6/">Data Structures and Algorithms with Object-Oriented Design Patterns in C#</a></li> | |
<li><a href="http://downloads.red-gate.com/ebooks/DotNet/illustratedcsharp2008.zip">Illustrated C# 2008</a> (.zip, dead link)</li> | |
</ul> | |
<h3><a name="Clojure">Clojure</a></h3> | |
<ul> | |
<li><a href="http://en.wikibooks.org/wiki/Clojure_Programming">Clojure Programming</a></li> | |
</ul> | |
<h3><a name="ColdFusion">ColdFusion</a></h3> | |
<ul> | |
<li><a href="https://github.com/mhenke/CFML-in-100-minutes/blob/master/cfml100mins.markdown">CFML In 100 Minutes</a></li> | |
</ul> | |
<h3><a name="DB2">DB2</a></h3> | |
<ul> | |
<li><a href="http://public.dhe.ibm.com/software/dw/db2/express-c/wiki/Getting_Started_with_IBM_Data_Studio_for_DB2_p3.pdf">Getting started with IBM Data Studio for DB2</a> (PDF)</li> | |
<li><a href="http://public.dhe.ibm.com/software/dw/db2/express-c/wiki/Getting_Started_with_DB2_App_Dev_p2.pdf">Getting started with IBM DB2 development</a> (PDF)</li> | |
<li><a href="http://public.dhe.ibm.com/software/dw/db2/express-c/wiki/Getting_Started_with_DB2_Express_v9.7_p4.pdf">Getting started with DB2 Express-C</a> (PDF)</li> | |
</ul> | |
<h3><a name="Delphi / Pascal">Delphi / Pascal</a></h3> | |
<ul> | |
<li><a href="http://www.marcocantu.com/epascal/">Essential Pascal Version 1 and 2</a></li> | |
<li><a href="http://www.lulu.com/content/435417">The Tomes of Delphi</a></li> | |
</ul> | |
<h3><a name="Django">Django</a></h3> | |
<ul> | |
<li><a href="http://djangobook.com/">Djangobook.com</a></li> | |
</ul> | |
<h3><a name="Erlang">Erlang</a></h3> | |
<ul> | |
<li><a href="http://learnyousomeerlang.com/">Learn You Some Erlang For Great Good</a></li> | |
</ul> | |
<h3><a name="Flex">Flex</a></h3> | |
<ul> | |
<li><a href="http://public.dhe.ibm.com/software/dw/db2/express-c/wiki/Getting_Started_with_Adobe_Flex_p2.pdf">Getting started with Adobe Flex</a> (PDF)</li> | |
</ul> | |
<h3><a name="F#">F#</a></h3> | |
<ul> | |
<li><a href="http://www.ctocorner.com/fsharp/book/ch0.aspx">The F# Survival Guide</a></li> | |
<li><a href="http://en.wikibooks.org/wiki/F_Sharp_Programming">F Sharp Programming</a> in Wikibooks</li> | |
<li><a href="http://msdn.microsoft.com/en-us/library/hh314518.aspx">Real World Functional Programming</a> (MSDN Chapters)</li> | |
</ul> | |
<h3><a name="Forth">Forth</a></h3> | |
<ul> | |
<li><a href="http://home.iae.nl/users/mhx/sf.html">Starting Forth</a></li> | |
<li><a href="http://thinking-forth.sourceforge.net/">Thinking Forth</a></li> | |
</ul> | |
<h3><a name="Git">Git</a></h3> | |
<ul> | |
<li><a href="http://progit.org/book/">Pro Git</a></li> | |
<li><a href="http://book.git-scm.com/index.html">The Git Community Book</a></li> | |
<li><a href="http://ftp.newartisans.com/pub/git.from.bottom.up.pdf">Git From The Bottom Up</a> (PDF)</li> | |
</ul> | |
<h3><a name="Grails">Grails</a></h3> | |
<ul> | |
<li><a href="http://www.infoq.com/minibooks/grails-getting-started">Getting Start with Grails</a></li> | |
</ul> | |
<h3><a name="Haskell">Haskell</a></h3> | |
<ul> | |
<li><a href="http://learnyouahaskell.com/chapters">Learn You a Haskell</a></li> | |
<li><a href="http://book.realworldhaskell.org/read/">Real World Haskell</a></li> | |
</ul> | |
<h3><a name="HTML / CSS">HTML / CSS</a></h3> | |
<ul> | |
<li><a href="http://fortuito.us/diveintohtml5/">Dive Into HTML5</a></li> | |
<li><a href="http://www.htmldog.com/">HTML Dog Tutorials</a></li> | |
</ul> | |
<h3><a name="Java">Java</a></h3> | |
<ul> | |
<li><a href="http://download.oracle.com/javase/tutorial/">Sun's Java Tutorials</a></li> | |
<li><a href="http://www.mindview.net/Books/TIJ/">Thinking in Java</a></li> | |
<li><a href="http://greenteapress.com/thinkapjava/">How to Think Like a Computer Scientist</a></li> | |
<li><a href="http://www.redbooks.ibm.com/redbooks/SG245118.html">Java Thin-Client Programming</a></li> | |
<li><a href="http://njbartlett.name/files/osgibook_preview_20091217.pdf">OSGi in Practice</a> (PDF)</li> | |
<li><a href="http://download.oracle.com/javaee/6/tutorial/doc/javaeetutorial6.pdf">Java 6 Tutorial</a> (PDF)</li> | |
</ul> | |
<h3><a name="JavaScript">JavaScript</a></h3> | |
<ul> | |
<li><a href="http://eloquentjavascript.net/">Eloquent JavaScript</a></li> | |
<li><a href="http://www.crockford.com/javascript/">Crockford's JavaScript</a></li> | |
<li><a href="http://www.rebeccamurphey.com/jqfundamentals/">jQuery Fundamentals</a> (starts with JavaScript basics)</li> | |
<li>Mozilla Developer Network's <a href="https://developer.mozilla.org/en/JavaScript/Guide">JavaScript Guide</a></li> | |
<li><a href="http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/">Essential Javascript & jQuery Design Patterns for Beginners</a></li> | |
</ul> | |
JavaScript (Node.js specific) | |
<ul> | |
<li><a href="http://ofps.oreilly.com/titles/9781449398583/">Up and Running with Node</a></li> | |
<li><a href="http://nodebeginner.org/">The Node Beginner Book</a></li> | |
<li><a href="http://visionmedia.github.com/masteringnode/">Mastering Node.js</a></li> | |
</ul> | |
<h3><a name="Latex">Latex</a></h3> | |
<ul> | |
<li><a href="http://tobi.oetiker.ch/lshort/lshort.pdf">The Not So Short Introduction to LATEX</a> (perfect for beginners)</li> | |
</ul> | |
<h3><a name="Linux">Linux</a></h3> | |
<ul> | |
<li><a href="http://www.advancedlinuxprogramming.com/">Advanced Linux Programming</a></li> | |
</ul> | |
<h3><a name="Lisp">Lisp</a></h3> | |
<ul> | |
<li><a href="http://www.cse.buffalo.edu/~shapiro/Commonlisp/">COMMON LISP: An Interactive Approach</a></li> | |
<li><a href="http://www.cse.buffalo.edu/~shapiro/Courses/CSE202/Summer2004/">A Short Course in Common Lisp</a></li> | |
<li><a href="http://mitpress.mit.edu/sicp/full-text/book/book.html">Structure And Interpretation of Computer Programs</a></li> | |
<li><a href="http://www.cs.cmu.edu/~dst/LispBook/book.pdf">A Gentle Introduction to Symbolic Computation</a> (PDF)</li> | |
<li><a href="http://www.gigamonkeys.com/book/">Practical Common Lisp</a></li> | |
<li><a href="http://www.paulgraham.com/onlisp.html">On Lisp</a></li> | |
<li><a href="http://www.paulgraham.com/acl.html">ANSI Common Lisp</a></li> | |
<li><a href="http://www.cs.cmu.edu/Groups/AI/html/cltl/mirrors.html">Common Lisp the Language, 2nd Edition</a></li> | |
<li><a href="http://psg.com/~dlamkins/sl/contents.html">Successful Lisp</a></li> | |
<li><a href="http://letoverlambda.com/index.cl/toc">Let Over Lambda - 50 Years of Lisp</a></li> | |
<li><a href="http://www.informatics.susx.ac.uk/research/groups/nlp/gazdar/nlp-in-lisp/index.html">Natural Language Processing in Lisp</a></li> | |
</ul> | |
<h3><a name="Lua">Lua</a></h3> | |
<ul> | |
<li><a href="http://www.lua.org/pil/">Programming In Lua</a> (for v5 but still largely relevant)</li> | |
<li><a href="http://www.lua.org/gems/">Lua Programming Gems</a> (not entirely free, but has a lot of free chapters and accompanying code)</li> | |
</ul> | |
<h3><a name="Maven">Maven</a></h3> | |
<ul> | |
<li><a href="http://www.maestrodev.com/better-build-maven">Better Builds with Maven</a></li> | |
<li><a href="http://www.sonatype.com/books/mvnex-book/reference/public-book.html">Maven by Example</a></li> | |
<li><a href="http://www.sonatype.com/books/mvnref-book/reference/public-book.html">Maven: The Complete Reference</a></li> | |
<li><a href="http://www.sonatype.com/books/nexus-book/reference/">Repository Management with Nexus</a></li> | |
<li><a href="http://www.sonatype.com/books/m2eclipse-book/reference/">Developing with Eclipse and Maven</a></li> | |
</ul> | |
<h3><a name="Mercurial">Mercurial</a></h3> | |
<ul> | |
<li><a href="http://hgbook.red-bean.com/">Mercurial: The Definitive Guide</a></li> | |
<li><a href="http://hginit.com/">HGInit - Mercurial Tutorial by Joel Spolsky</a></li> | |
</ul> | |
<h3><a name="Nemerle">Nemerle</a></h3> | |
<ul> | |
<li><a href="http://asaha.com/ebook/AMTQ2NjA-/Nemerle.pdf#">Nemerle</a></li> | |
</ul> | |
<h3><a name=".NET">.NET</a></h3> | |
<ul> | |
<li><a href="http://www.programmersheaven.com/2/CSharpBook">C# School</a> (covers C# 1.0 and 2.0)</li> | |
<li><a href="http://www.infoq.com/minibooks/vsnettt">Visual Studio Tips and Tricks</a> (VS 2003-2005 only)</li> | |
<li><a href="http://weblogs.asp.net/zeeshanhirani/archive/2008/12/05/my-christmas-present-to-the-entity-framework-community.aspx">Entity Framework</a></li> | |
<li><a href="http://www.charlespetzold.com/dotnet/index.html">Charles Petzold's .NET Book 0</a></li> | |
<li><a href="http://www.albahari.com/threading/">Threading in C#</a></li> | |
<li><a href="http://www.csharpcourse.com/">C# Yellow Book</a> (intro to programming)</li> | |
<li><a href="http://en.wikibooks.org/wiki/C_Sharp_Programming">C# Programming - Wikibook</a></li> | |
<li><a href="http://www.techotopia.com/index.php/C_Sharp_Essentials">C# Essentials</a></li> | |
<li><a href="http://www.brpreiss.com/books/opus6/">Data Structures and Algorithms with Object-Oriented Design Patterns in C#</a></li> | |
<li><a href="http://asaha.com/ebook/AMTQ2NjA-/Nemerle.pdf#">Nemerle</a></li> | |
</ul> | |
<h3><a name="NoSQL">NoSQL</a></h3> | |
<ul> | |
<li><a href="http://books.couchdb.org/relax/">CouchDB: The Definitive Guide</a></li> | |
<li><a href="http://openmymind.net/2011/3/28/The-Little-MongoDB-Book">The Little MongoDB Book</a></li> | |
</ul> | |
<h3><a name="Oberon">Oberon</a></h3> | |
<ul> | |
<li><a href="http://www-old.oberon.ethz.ch/WirthPubl/ProgInOberon.pdf">Programming in Oberon</a> (PDF)</li> | |
</ul> | |
<h3><a name="Objective-C">Objective-C</a></h3> | |
<ul> | |
<li><a href="http://developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/">The Objective-C Programming Language</a></li> | |
</ul> | |
<h3><a name="OCaml">OCaml</a></h3> | |
<ul> | |
<li><a href="http://ocamlunix.forge.ocamlcore.org/">Unix System Programming in OCaml</a></li> | |
<li><a href="http://www.cs.caltech.edu/courses/cs134/cs134b/book.pdf">Introduction to OCaml</a> (PDF)</li> | |
</ul> | |
<h3><a name="Oracle Server">Oracle Server</a></h3> | |
<ul> | |
<li>Oracle's <a href="http://tahiti.oracle.com/">Guides and Manuals</a></li> | |
</ul> | |
<h3><a name="Oracle PL/SQL">Oracle PL/SQL</a></h3> | |
<ul> | |
<li><a href="http://download.oracle.com/docs/cd/E11882_01/appdev.112/e17126/toc.htm">PL/SQL Language Reference</a></li> | |
<li><a href="http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/toc.htm">PL/SQL Packages and Types Reference</a></li> | |
<li><a href="http://www.toadworld.com/Knowledge/DatabaseKnowledge/StevenFeuersteinsPLSQLObsession/tabid/153/Default.aspx">Steven Feuerstein's PL/SQL Obsession - Videos and Presentations</a></li> | |
</ul> | |
<h3><a name="Parrot / Perl 6">Parrot / Perl 6</a></h3> | |
<ul> | |
<li><a href="http://github.com/perl6/book/">Using Perl 6</a> (work in progress)</li> | |
</ul> | |
<h3><a name="Perl">Perl</a></h3> | |
<ul> | |
<li><a href="http://hop.perl.plover.com/book/">Higher-Order Perl</a></li> | |
<li><a href="http://www.greenteapress.com/perl/">Perl The Hard Way</a></li> | |
<li><a href="http://www.extremeperl.org/bk/home">Extreme Perl</a></li> | |
<li><a href="http://linkmingle.com/list/13-plus-List-of-Free-Great-Perl-Books-available-Online-freebooksandarticles">Perl Free Online EBooks</a> (meta-list)</li> | |
<li><a href="http://www.masonbook.com/book/">The Mason Book</a></li> | |
<li><a href="http://modperlbook.org/">Practical mod_perl</a></li> | |
<li><a href="http://www.perl.org/books/beginning-perl/">Beginning Perl</a></li> | |
<li><a href="http://www.masonbook.com/book/">Embedding Perl in HTML with Mason</a></li> | |
<li><a href="http://lwp.interglacial.com/index.html">Perl & LWP</a></li> | |
<li><a href="http://www.globalspin.com/thebook/">Perl for the Web</a></li> | |
<li><a href="http://oreilly.com/openbook/webclient/">Web Client Programming with Perl</a></li> | |
<li><a href="http://www.onyxneon.com/books/modern_perl/index.html">Modern Perl 5</a></li> | |
</ul> | |
<h3><a name="PHP">PHP</a></h3> | |
<ul> | |
<li><a href="http://symfony.com/doc/current/book/index.html">Symfony2</a></li> | |
<li><a href="http://www.tuxradar.com/practicalphp">Practical PHP Programming</a> (wiki containing O'Reilly's <em>PHP In a Nutshell</em>)</li> | |
<li><a href="http://www.survivethedeepend.com/">Zend Framework: Survive the Deep End</a></li> | |
</ul> | |
<h3><a name="PowerShell">PowerShell</a></h3> | |
<ul> | |
<li><a href="http://powershell.com/cs/blogs/ebook/">Mastering PowerShell</a></li> | |
</ul> | |
<h3><a name="Prolog">Prolog</a></h3> | |
<ul> | |
<li><a href="http://www.amzi.com/ExpertSystemsInProlog/">Building Expert Systems in Prolog</a></li> | |
<li><a href="http://www.amzi.com/AdventureInProlog/advfrtop.htm">Adventure in Prolog</a></li> | |
<li><a href="http://computing.unn.ac.uk/staff/cgpb4/prologbook/">Prolog Programming A First Course</a></li> | |
<li><a href="http://www.ida.liu.se/~ulfni/lpp/">Logic, Programming and Prolog (2ed)</a></li> | |
<li><a href="http://www.j-paine.org/prolog/mathnotes/files/pms/pms.html">Introduction to Prolog for Mathematicians</a></li> | |
<li><a href="http://www.learnprolognow.org/">Learn Prolog Now!</a></li> | |
<li><a href="http://www.informatics.susx.ac.uk/research/groups/nlp/gazdar/nlp-in-prolog/index.html">Natural Language Processing in Prolog</a></li> | |
<li><a href="http://cs.union.edu/~striegnk/courses/nlp-with-prolog/html/">Natural Language Processing Techniques in Prolog</a></li> | |
<li><a href="http://bookboon.com/int/student/it/prolog-techniques-applications-of-prolog">Prolog techniques</a></li> | |
<li><a href="http://bookboon.com/int/student/it/applications-of-prolog">Applications of Prolog</a></li> | |
<li><a href="http://www.cs.bris.ac.uk/~flach/SimplyLogical.html">Simply logical</a></li> | |
</ul> | |
<h3><a name="PostgreSQL">PostgreSQL</a></h3> | |
<ul> | |
<li><a href="http://www.commandprompt.com/ppbook/">Practical PostgreSQL</a></li> | |
</ul> | |
<h3><a name="Python">Python</a></h3> | |
<ul> | |
<li><a href="http://www.swaroopch.com/notes/Python">Byte of Python</a></li> | |
<li><a href="http://homepage.mac.com/s_lott/books/python.html">Building Skills in Python Version 2.5</a></li> | |
<li><a href="http://openbookproject.net/pybiblio/">Python Bibliotheca</a></li> | |
<li><a href="http://www.greenteapress.com/thinkpython/thinkpython.pdf">Think Python</a> (PDF)</li> | |
<li><a href="http://www.brpreiss.com/books/opus7/html/book.html">Data Structures and Algorithms in Python</a></li> | |
<li><a href="http://www.diveintopython.net/">Dive into Python</a></li> | |
<li><a href="http://www.greenteapress.com/thinkpython/thinkCSpy/">How to Think Like a Computer Scientist: Learning with Python</a></li> | |
<li><a href="http://www.openbookproject.net/py4fun/">Python for Fun</a></li> | |
<li><a href="http://inventwithpython.com/">Invent Your Own Computer Games With Python</a></li> | |
<li><a href="http://learnpythonthehardway.org">Learn Python The Hard Way</a></li> | |
<li><a href="http://www.mindview.net/Books/TIPython/">Thinking in Python</a></li> | |
<li><a href="http://djangobook.com/">The Django Book</a></li> | |
<li><a href="http://www.briggs.net.nz/log/writing/snake-wrangling-for-kids/" title="SWFK">Snake Wrangling For Kids</a></li> | |
<li><a href="http://www.nltk.org/book">Natural Language Processing with Python</a></li> | |
</ul> | |
<h3><a name="R">R</a></h3> | |
<ul> | |
<li><a href="http://cran.r-project.org/manuals.html">The R Manuals</a></li> | |
<li><a href="http://stat.ethz.ch/R-manual/R-patched/doc/html/">The R Language</a></li> | |
<li><a href="http://www.mayin.org/ajayshah/KB/R/index.html">R by example</a></li> | |
<li><a href="http://stats.lse.ac.uk/penzer/ST419materials/">Computational Statistics, Jeremy Penzer</a></li> | |
</ul> | |
<h3><a name="Ruby">Ruby</a></h3> | |
<ul> | |
<li><a href="http://www.ruby-doc.org/docs/ProgrammingRuby/">Programming Ruby</a></li> | |
<li><a href="http://mislav.uniqpath.com/poignant-guide/">Why's (Poignant) Guide to Ruby</a> (<a href="http://www.scribd.com/doc/2236084/Whys-Poignant-Guide-to-Ruby">mirror</a>)</li> | |
<li><a href="http://www.humblelittlerubybook.com/">Mr. Neighborly's Humble Little Ruby Book</a></li> | |
<li><a href="http://rubybestpractices.com/">Ruby Best Practices</a></li> | |
<li><a href="http://macruby.labs.oreilly.com/">MacRuby: The Definitive Guide</a></li> | |
<li><a href="http://ruby.learncodethehardway.org/book/">Learn Ruby the hard way</a></li> | |
</ul> | |
<h3><a name="Ruby on Rails">Ruby on Rails</a></h3> | |
<ul> | |
<li><a href="http://ruby.railstutorial.org/ruby-on-rails-tutorial-book">Ruby on Rails Tutorial: Learn Rails By Example</a></li> | |
</ul> | |
<h3><a name="Scala">Scala</a></h3> | |
<ul> | |
<li><a href="http://www.artima.com/pins1ed/">Programming in Scala, First Edition</a></li> | |
<li><a href="http://www.scala-lang.org/docu/files/ScalaTutorial.pdf">A Scala Tutorial for Java programmers</a> (PDF)</li> | |
<li><a href="http://www.scala-lang.org/docu/files/ScalaByExample.pdf">Scala By Example</a> (PDF)</li> | |
<li><a href="http://programming-scala.labs.oreilly.com/index.html">Programming Scala</a></li> | |
<li><a href="http://github.com/leithaus/XTrace/tree/monadic/src/main/book/content/">Xtrace</a> (Github)</li> | |
<li><a href="http://github.com/tjweir/liftbook">Lift</a> (Github)</li> | |
<li><a href="http://github.com/leithaus/XTrace/tree/monadic/src/main/book/content/">Pro Scala: Monadic Design Patterns for the Web</a></li> | |
<li><a href="http://exploring.liftweb.net/">Exploring Lift</a> (published earlier as "The Definitive Guide to Lift", <a href="http://groups.google.com/group/the-lift-book">PDF</a>)</li> | |
</ul> | |
<h3><a name="Scheme">Scheme</a></h3> | |
<ul> | |
<li><a href="http://www.scheme.com/tspl4/">The Scheme Programming Language (Edition 4)</a></li> | |
</ul> | |
<h3><a name="Smalltalk">Smalltalk</a></h3> | |
<ul> | |
<li><a href="http://stephane.ducasse.free.fr/FreeBooks.html">Free Online Smalltalk Books</a> (meta-list)</li> | |
<li><a href="http://www.squeakbyexample.org/">Squeak By Example</a> (Smalltalk IDE)</li> | |
</ul> | |
<h3><a name="Subversion">Subversion</a></h3> | |
<ul> | |
<li><a href="http://www.phptr.com/content/images/0131855182/downloads/Nagel_book.pdf">Subversion Version Control</a> (PDF)</li> | |
<li><a href="http://svnbook.red-bean.com/">Version Control with Subversion</a></li> | |
</ul> | |
<h3><a name="SQL">SQL</a></h3> | |
<ul> | |
<li><a href="http://www.cs.arizona.edu/people/rts/publications.html">Developing Time-Oriented Database Applications in SQL</a></li> | |
<li><a href="http://Use-The-Index-Luke.com/">Use The Index, Luke!</a> (a guide to SQL database performance for developers)</li> | |
<li><a href="sql.learncodethehardway.org">Learn SQL The Hard Way</a></li> | |
</ul> | |
<h3><a name="Vim">Vim</a></h3> | |
<ul> | |
<li><a href="http://www.swaroopch.com/notes/Vim">A Byte of Vim</a></li> | |
<li><a href="http://vim.runpaint.org/toc/">Vim Recipes</a></li> | |
</ul> | |
<h3><a name="Emacs">Emacs</a></h3> | |
<ul> | |
<li><a href="http://www.gnu.org/software/emacs/emacs-lisp-intro/">An Introduction to Programming in Emacs Lisp (Third Edition)</a></li> | |
<li><a href="http://www.gnu.org/software/emacs/manual/emacs.html">GNU Emacs manual</a></li> | |
</ul> | |
</div> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Merc Release 2.1 | |
Sunday 01 August 1993 | |
Furey [email protected] | |
Hatchet [email protected] | |
Kahn [email protected] | |
=== 'I'm running a Mud so I can learn C programming!' | |
Yeah, right. | |
The purpose of this document is to record some of our knowledge, experience and | |
philosophy. No matter what your level, we hope that this document will help | |
you become a better software engineer. | |
Remember that engineering is work, and NO document will substitute for your | |
own thinking, learning and experimentation. | |
=== How to Learn in the First Place | |
(1) Play with something. | |
(2) Read the documentation on it. | |
(3) Play with it some more. | |
(4) Read documentation again. | |
(5) Play with it some more. | |
(6) Read documentation again. | |
(7) Play with it some more. | |
(8) Read documentation again. | |
(9) Get the idea? | |
The idea is that your mind can accept only so much 'new data' in a single | |
session. Playing with something doesn't introduce very much new data, but it | |
does transform data in your head from the 'new' category to the 'familiar' | |
category. Reading documentation doesn't make anything 'familiar', but it | |
refills your 'new' hopper. | |
Most people, if they even read documentation in the first place, never return | |
to it. They come to a certain minimum level of proficiency and then never | |
learn any more. But modern operating systems, languages, networks, and even | |
applications simply cannot be learned in a single session. You have to work | |
through the two-step learning cycle MANY times to master it. | |
=== The Environment | |
Computer: the big or little box that you're using to run Merc. Computers come | |
from a _manufacturer_ and have a _model_ name. Here is a list of common | |
manufacturers and models that you're likely to encounter: | |
Manufacturer Model | |
------------ ----- | |
Sun Sun-2 | |
Sun Sun-3 | |
Sun Sun-4 | |
DEC Vax 5000 | |
DEC Vax 5900 | |
IBM RS/6000 | |
NeXT NextCube | |
Sequent Symmetry | |
Sequent Balance | |
As far as hardware goes, Merc will run on any 32-bit hardware. | |
Operating system: the lowest level program running on your computer. Most | |
common computers run Unix or some variant of it, such as SunOS, Ultrix, | |
AIX, Mach, or Dynix. Notice that many of these variants end in 'IX'. | |
The two major 'families' of Unix are Berkeley Unix (developed at the | |
illustrious University of California, Berkeley) and System 5 Unix | |
(developed by Bell Laboratories, the progenitors of Unix). | |
The most common non-Unix operating system is VMS (a proprietary operating | |
system from DEC for their VAX computers). In the personal computer world, | |
you'll find MS-DOS, OS/2 for IBM PC's and compatibles, and MacOS for Apple | |
Macintosh'es. | |
GET THIS STRAIGHT: 'VAX' IS NOT AN OPERATING SYSTEM. It's the name of a | |
family of computers from DEC. There are plenty of Vax'es running VMS, and | |
there are even more Vax'es running Berkeley Unix or Ultrix. The Vax'es | |
running Unix have a lot more in common with other machines running | |
Unix than they have with Vax'es running VMS. | |
As far as operating systems go, Merc will run on Unix or Unix variants with | |
TCP/IP networking compatible with Berkeley Unix. It will also run, in | |
single-user mode only, on MS-DOS. With a reasonable amount of work, Merc | |
can be ported to any operating system that provides TCP service for telnet | |
connections. | |
Languages: Merc is written in C. ANSI (the American National Standards | |
Institute) has a specification for the C language, and Merc is written in | |
Ansi Standard C. | |
The most popular compiler for Ansi Standard C is the Gnu 'gcc' compiler | |
produced by the Free Software Foundation. It's available by anonymous | |
ftp from prep.ai.mit.edu. Merc compiles just fine with Gcc 1.38, so | |
you can probably use 1.42 and skip the much larger 2.X versions. | |
You don't have to use gcc. IBM RS/6000's running the AIX operating system | |
come with an Ansi C compiler already. So do NeXT machines (the standard | |
'cc' on NeXT happens to be the Gnu C compiler). Any Ansi compiler will | |
work. | |
Unfortunately, there are still many machines out there without an Ansi | |
standard C compiler. (Sun is the worst offender in this regard). You | |
can attempt to compile Merc with a non-Ansi (traditional) C compiler by | |
using the 'mktrad' script. See trad.txt for details. | |
If you don't know what the manufacturer and model of your computer is, as well | |
as its operating system, and whether the C compiler is Ansi or non-Ansi, then | |
you need to find out. | |
=== Basic Unix Tools | |
'man' -- gives you online manual pages | |
'grep' -- stands for 'global regular expression print' | |
'vi' | |
'emacs' | |
'jove' -- use whatever editor floats your boat | |
but learn the hell out of it | |
you should know EVERY command in your editor | |
'ctags' -- makes 'tags' for your editor | |
allows you to goto functions by name in any source file | |
'>' | |
'>>' | |
'<' | |
'|' -- input and output redirection | |
get someone to show you, or dig it out of 'man csh' | |
These are the basic day-in day-out development tools. Developing without | |
knowing how to use ALL of these well is like driving a car without knowing how | |
to change gears. | |
=== Debugging: Theory | |
Debugging is a science. You formulate a hypothesis, make predictions based on | |
the hypothesis, run the program and provide it experimental input, observe its | |
behavior, and confirm or refute the hypothesis. | |
A good hypothesis is one which makes surprising predictions which then come | |
true; predictions that other hypotheses don't make. | |
The first step in debugging is not to write bugs in the first place. This | |
sounds obvious, but sadly, is all too often ignored. | |
If you build a program, and you get ANY errors or ANY warnings, you should fix | |
them before continuing. C was designed so that many buggy ways of writing code | |
are legal, but will draw warnings from a suitably smart compiler (such as 'gcc' | |
with the '-Wall' flag enabled). It takes only minutes to check your warnings | |
and to fix the code that generates them, but it takes hours to find bugs | |
otherwise. | |
'Desk checking' (proof reading) is almost a lost art in 1993. Too bad. You | |
should desk check your code before even compiling it, and desk-check it again | |
periodically to keep it fresh in mind and find new errors. If you have someone | |
in your group whose ONLY job it is to desk-check other people's code, that | |
person will find and fix more bugs than everyone else combined. | |
One can desk-check several hundred lines of code per hour. A top-flight | |
software engineer will write, roughly, 99% accurate code on the first pass, | |
which still means one bug per hundred lines. And you are not top flight. | |
So ... you will find several bugs per hour by desk checking. This is a very | |
rapid bug fixing technique. Compare that to all the hours you spend screwing | |
around with broken programs trying to find ONE bug at a time. | |
The next technique beyond desk-checking is the time-honored technique of | |
inserting 'print' statements into the code, and then watching the logged | |
values. Within Merc code, you can call 'printf' or 'fprintf' to dump | |
interesting values at interesting times. Where and when to dump these values | |
is an art, which you will learn only with practice. | |
If you don't already know how to redirect output in your operating system, now | |
is the time to learn. On Unix, type the command 'man csh', and read the part | |
about the '>' operator. You should also learn the difference between | |
'standard output' (e.g. output from 'printf') and 'error output' (e.g. output | |
from 'fprintf'). | |
Ultimately, you cannot fix a program unless you understand how it's operating | |
in the first place. Powerful debugging tools will help you collect data, but | |
they can't interpret it, and they can't fix the underlying problems. Only you | |
can do that. | |
When you find a bug ... your first impulse will be to change the code, kill the | |
manifestation of the bug, and declare it fixed. Not so fast! The bug you | |
observe is often just the symptom of a deeper bug. You should keep pursuing | |
the bug, all the way down. You should grok the bug and cherish it in fullness | |
before causing its discorporation. | |
Also, when finding a bug, ask yourself two questions: 'what design and | |
programming habits led to the introduction of the bug in the first place?' | |
And: 'what habits would systematically prevent the introduction of bugs like | |
this?' | |
=== Debugging: Tools | |
When a Unix process accesses an invalid memory location, or (more rarely) | |
executes an illegal instruction, or (even more rarely) something else goes | |
wrong, the Unix operating system takes control. The process is incapable of | |
further execution and must be killed. Before killing the process, however, the | |
operating system does something for you: it opens a file named 'core' and | |
writes the entire data space of the process into it. | |
Thus, 'dumping core' is not a cause of problems, or even an effect of problems. | |
It's something the operating system does to help you find fatal problems which | |
have rendered your process unable to continue. | |
One reads a 'core' file with a debugger. The two most popular debuggers on | |
Unix are 'adb' and 'gdb', although occasionally one finds 'dbx'. Typically | |
one starts a debugger like this: 'adb merc' or 'gdb merc core'. | |
The first thing, and often the only thing, you need to do inside the debugger | |
is take a stack trace. In 'adb', the command for this is '$c'. In gdb, | |
the command is 'backtrace'. The stack trace will tell you what function your | |
program was in when it crashed, and what functions were calling it. The | |
debugger will also list the arguments to these functions. Interpreting these | |
arguments, and using more advanced debugger features, requires a fair amount of | |
knowledge about assembly language programming. | |
If you have access to a program named 'Purify' ... learn how to use it. | |
=== Profiling | |
Here is how to profile a program: | |
(1) Remove all the .o files and the 'merc' executable: | |
rm *.o 'merc' | |
(2) Edit your makefile, and change the PROF= line: | |
PROF = -p | |
(3) Remake merc: | |
make | |
(4) Run merc as usual. Shutdown the game with shutdown when you have run long | |
enough to get a good profiling base. If you crash the game, or kill the | |
process externally, you won't get profiling information. | |
(5) Run the 'prof' command: | |
prof merc > prof.out | |
(6) Read prof.out. Run 'man prof' to understand the format of the output. | |
For advanced profiling, you can use 'PROF = -pg' in step (2), and use the | |
'gprof' command in step 5. The 'gprof' form of profiling gives you a report | |
which lists exactly how many times any function calls any other function. This | |
information is valuable for debugging as well as performance analysis. | |
Availability of 'prof' and 'gprof' varies from system to system. Almost every | |
Unix system has 'prof'. Only some systems have 'gprof'. | |
=== Schedule versus Features versus Quality | |
Now for a few words on project management. | |
Sooner or later, almost any project faces a trade-off between schedule, | |
features, and quality. Consider a student writing a term paper on the last | |
night. He has three unpalatable choices: he can turn it in late (miss the | |
schedule). He can turn in a shorter paper that doesn't cover everything | |
(reduce the features). Or he can churn out gibberish (lower the quality). | |
Similarly in a software project, one often has a choice between making the | |
release date, or dropping features, or shipping everything on time and | |
hoping that it works (it usually doesn't). | |
The most important thing to realize about this decision is that it IS a | |
decision. One can't get out of it by hoping that some miracle will occur. | |
If you don't react consciously, then external circumstances will drive the | |
decision. | |
Ok, so suppose you are faced with the trade-off and go for a schedule slip. | |
Don't take a small slip ... take a big impressive slip. If you say | |
'I'll just fix this one problem and finish ASAP', then likely you will | |
wish you had taken just a little more time later. If you say 'I think I | |
need another day, so I'll slip by a week', then it's much more likely | |
that what you'll have at the end of the week will do the job. It's better | |
to slip a large block of time once then to slip day-by-day or hour-by-hour | |
repeatedly. | |
If you go for dropping features, again, carve off a big hunk. Don't be | |
timid and pretend that you're going to do that work 'if you just get a | |
little spare time.' That feature of your project is GONE, exploit the | |
lessened requirements for all the savings you can! | |
I can't offer much advise on how to reduce quality, because that's always | |
my last choice for what to drop on a project. | |
=== Sleeping | |
Simple and obvious, but true ... engineering takes an alert mind. | |
It's very easy, very seductive, to throw a lot of consecutive hours at a | |
problem. One can get into a 'flow' state where one's mind becomes filled | |
with the problem, and the work just pours out, hour after hour. Many | |
writers report that they watch a story take place, and just transcribe | |
what they see, pounding out page after page of text. Many software | |
engineers have experienced a similar feeling, where the code appears | |
to arise spontaneously as they watch themselves type. | |
I believe most real work gets done in this state. | |
My experience, however, is that the 'flow' period can end subtly and | |
gradually. Without ever noticing a change, I notice that new work isn't | |
flowing out of my hands anymore, that I'm spending lots of time fixing | |
up mistakes I made just a few moments ago. Instead of ideas flashing | |
confidently through my mind, doubts and questions arise. | |
At this point there is a temptation to throw some more hours at the problem. | |
'I'm here, and I was getting a lot of work done, why don't I just stay all | |
night until I figure this out?' This is a trap! Don't do it! | |
Instead, I suggest: go home, eat, shower, sleep, put yourself back together | |
again. Resume the next day. While you sleep, your mind will work on the | |
problem anyways, and you'll probably wake up with new ideas. You'll get | |
more done between 10:00 am and 2:00 pm the next day, then if you stayed up | |
between midnight and 10:00 am. | |
There is a problem with this strategy: remotivating yourself in the morning. | |
If the project is one of your choice, that's usually not a problem. If it's | |
something you have to do but don't enjoy, you have to balance the remotivation | |
problem versus the very low productivity of working without sleep. | |
=== Books for Serious Programmers | |
Out of all the thousands of books out there, three stand out: | |
Kernighan and Plaugher, _The Elements of Programming Style_. | |
Kernighan and Ritchie, _The C Programming Language_. | |
Brooks, _The Mythical Man Month_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Hide the [edit] sections on WP, using the browser's $x XPath shortcut */ | |
nodes = $x("//*[@class='editsection']"); for (var n in nodes) nodes[n].style.display='none'; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
//div[contains(concat(' ', normalize-space(@Class), ' '), ' someclass ')]