You are on page 1of 16

3/10/2016

Whateverycomputersciencemajorshouldknow

Whateverycomputersciencemajorshouldknow
Giventheexpansivegrowthinthefield,it'sbecomechallengingtodiscernwhatbelongsinamodern
computersciencedegree.
Myownfacultyisengaginginthisdebate,soI'vecoalescedmythoughtsasananswertothe
question,"Whatshouldeverycomputersciencemajorknow?"
I'vetriedtoanswerthisquestionastheconjunctionoffourconcerns:
Whatshouldeverystudentknowtogetagoodjob?
Whatshouldeverystudentknowtomaintainlifelongemployment?
Whatshouldeverystudentknowtoentergraduateschool?
Whatshouldeverystudentknowtobenefitsociety?
Mythoughtsbelowfactorintobothgeneralprinciplesandspecificrecommendationsrelevanttothe
moderncomputinglandscape.
Computersciencemajors:feelfreetousethisasaselfstudyguide.
Pleaseemailortweetwithsuggestionsforadditionanddeletion.
Update:Thanksforthesuggestionsandreminders!I'llincorporatethemasIreceivethemtokeep
thisalivingdocument.

Portfolioversusresume
Havingemergedfromengineeringandmathematics,computerscienceprogramstakearesume
basedapproachtohiringofftheirgraduates.
Aresumesaysnothingofaprogrammer'sability.
Everycomputersciencemajorshouldbuildaportfolio.
Aportfoliocouldbeassimpleasapersonalblog,withapostforeachprojectoraccomplishment.A
betterportfoliowouldincludeperprojectpages,andpubliclybrowsablecode(hostedperhapson
githuborGooglecode).
Contributionstoopensourceshouldbelinkedanddocumented.
Acodeportfolioallowsemployerstodirectlyjudgeability.
GPAsandresumesdonot.
Professorsshoulddesigncourseprojectstoimpressonportfolios,andstudents,attheconclusionof
http://matt.might.net/articles/whatcsmajorsshouldknow/

1/16

3/10/2016

Whateverycomputersciencemajorshouldknow

eachcourse,shouldtaketimetoupdatethem.

Technicalcommunication
Lonewolvesincomputerscienceareanendangeredspecies.
Moderncomputerscientistsmustpracticepersuasivelyandclearlycommunicatingtheirideastonon
programmers.
Insmallercompanies,whetherornotaprogrammercancommunicateherideastomanagement
maymakethedifferencebetweenthecompany'ssuccessandfailure.
Unfortunately,thisisnotsomethingfixedwiththeadditionofasingleclass(althoughasolidcoursein
technicalcommunicationdoesn'thurt).
Moreclassesneedtoprovidestudentstheopportunitytopresenttheirworkanddefendtheirideas
withoralpresentations.

Specificrecommendations
IwouldrecommendthatstudentsmasterapresentationtoollikePowerPointor(myfavorite)
Keynote.(Sorry,asmuchasIlovethem,LaTeXbasedpresentationtoolsarejusttoostatic.)
Forproducingbeautifulmathematicaldocumentation,LaTeXhasnoequal.Allwrittenassignmentsin
technicalcoursesshouldbesubmittedinLaTeX.

Anengineeringcore
Computerscienceisnotquiteengineering.
But,it'scloseenough.
Computerscientistswillfindthemselvesworkingwithengineers.
Computerscientistsandtraditionalengineersneedtospeakthesamelanguagealanguagerooted
inrealanalysis,linearalgebra,probabilityandphysics.
Computerscientistsoughttotakephysicsthroughelectromagnetism.But,todothat,they'llneedtake
upthroughmultivariatecalculus,(anddifferentialequationsforgoodmeasure).
Inconstructingsoundsimulations,acommandofprobabilityand(oftentimes)linearalgebrais
invaluable.Ininterpretingresults,thereisnosubstituteforasolidunderstandingofstatistics.

TheUnixphilosophy
ComputerscientistsshouldbecomfortablewithandpracticedintheUnixphilosophyofcomputing.
http://matt.might.net/articles/whatcsmajorsshouldknow/

2/16

3/10/2016

Whateverycomputersciencemajorshouldknow

TheUnixphilosophy(asopposedtoUnixitself)isonethatemphasizeslinguisticabstractionand
compositioninordertoeffectcomputation.
Inpractice,thismeansbecomingcomfortablewiththenotionofcommandlinecomputing,textfile
configurationandIDElesssoftwaredevelopment.

Specificrecommendations
GiventheprevalenceofUnixsystems,computerscientiststodayshouldbefluentinbasicUnix,
includingtheabilityto:
navigateandmanipulatethefilesystem
composeprocesseswithpipes
comfortablyeditafilewithemacsandvim
create,modifyandexecuteaMakefileforasoftwareproject
writesimpleshellscripts.
StudentswillrejecttheUnixphilosophyunlesstheyunderstanditspower.Thus,it'sbesttochallenge
studentstocompleteusefultasksforwhichUnixhasacomparativeadvantage,suchas:
Findthefivefoldersinagivendirectoryconsumingthemostspace.
ReportduplicateMP3s(byfilecontents,notfilename)onacomputer.
Takealistofnameswhosefirstandlastnameshavebeenlowercased,andproperlyrecapitalize
them.
FindallwordsinEnglishthathavexastheirsecondletter,andnastheirsecondtolast.
Directlyrouteyourmicrophoneinputoverthenetworktoanothercomputer'sspeaker.
Replaceallspacesinafilenamewithunderscoreforagivendirectory.
ReportthelasttenerrantaccessestothewebservercomingfromaspecificIPaddress.

Systemsadministration
Somecomputerscientistssneeratsystemsadministrationasan"IT"task.
Thethinkingisthatacomputerscientistcanteachherselfhowtodoanythingatechniciancando.
Thisistrue.(Intheory.)
Yetthisattitudeismisguided:computerscientistsmustbeabletocompetentlyandsecurely
administertheirownsystemsandnetworks.
Manytasksinsoftwaredevelopmentaremostefficientlyexecutedwithoutpassingthroughasystems
administrator.

Specificrecommendations
Everymoderncomputerscientistshouldbeableto:
http://matt.might.net/articles/whatcsmajorsshouldknow/

3/16

3/10/2016

Whateverycomputersciencemajorshouldknow

InstallandadministeraLinuxdistribution.
ConfigureandcompiletheLinuxkernel.
Troubleshootaconnectionwithdig,pingandtraceroute.
Compileandconfigureawebserverlikeapache.
CompileandconfigureaDNSdaemonlikebind.
Maintainawebsitewithatexteditor.

Programminglanguages
Programminglanguagesriseandfallwiththesolarcycle.
Aprogrammer'scareershouldnot.
Whileitisimportanttoteachlanguagesrelevanttoemployers,itisequallyimportantthatstudents
learnhowtoteachthemselvesnewlanguages.
Thebestwaytolearnhowtolearnprogamminglanguagesistolearnmultipleprogramming
languagesandprogrammingparadigms.
Thedifficultyoflearningthenthlanguageishalfthedifficultyofthe(n1)th.
Yet,totrulyunderstandprogramminglanguages,onemustimplementone.Ideally,everycomputer
sciencemajorwouldtakeacompilersclass.Ataminimum,everycomputersciencemajorshould
implementaninterpreter.

Specificlanguages
Thefollowinglanguagesprovideareasonablemixtureofparadigmsandpracticalapplications:
Racket
C
JavaScript
Squeak
Java
StandardML
Prolog
Scala
Haskell
C++and
Assembly.
Racket
Racket,asafullfeatureddialectofLisp,hasanaggressivelysimplesyntax.
Forasmallfractionofstudents,thissyntaxisanimpediment.
http://matt.might.net/articles/whatcsmajorsshouldknow/

4/16

3/10/2016

Whateverycomputersciencemajorshouldknow

Tobeblunt,ifthesestudentshaveafundamentalmentalbarriertoacceptinganaliensyntactic
regimeeventemporarily,theylackthementaldexteritytosurviveacareerincomputerscience.
Racket'spowerfulmacrosystemandfacilitiesforhigherorderprogrammingthoroughlyerasetheline
betweendataandcode.
Iftaughtcorrectly,Lispliberates.
Recommendedreading

ANSIC
Cisaterseandunforgivingabstractionofsilicon.
Cremainswithoutrivalinprogrammingembeddedsystems.
LearningCimpartsadeepunderstandingofthedominantvonNeumannarchitectureinawaythat
nootherlanguagecan.
GiventheintimaterolepoorCprogrammingplaysintheprevalenceofthebufferoverflowsecurity
vulnerabilities,itiscriticalthatprogrammerslearnhowtoprogramCproperly.
Recommendedreading

JavaScript
JavaScriptisagoodrepresentativeofthesemanticmodelpopularindynamic,higherorder
languagessuchasPython,RubyandPerl.
Asthenativelanguageoftheweb,itspragmaticadvantagesareunique.
Recommendedreading

Squeak
SqueakisamoderndialectofSmalltalk,purestofobjectorientedlanguages.
Itimpartstheessenceof"objectoriented."
Recommendedreading

Java
Javawillremainpopularfortoolongtoignoreit.
Recommendedreading

StandardML
StandardMLisacleanembodimentoftheHindleyMilnersystem.
TheHindleyMilnertypesystemisoneofthegreatest(yetleastknown)achievementsinmodern
http://matt.might.net/articles/whatcsmajorsshouldknow/

5/16

3/10/2016

Whateverycomputersciencemajorshouldknow

computing.
Thoughexponentialincomplexity,typeinferenceinHindleyMilnerisalwaysfastforprogramsof
humaninterest.
Thetypesystemisrichenoughtoallowtheexpressionofcomplexstructuralinvariants.Itissorich,
infact,thatwelltypedprogramsareoftenbugfree.
Recommendedreading

Prolog
Thoughnicheinapplication,logicprogrammingisanalternateparadigmforcomputationalthinking.
It'sworthunderstandinglogicprogrammingforthoseinstanceswhereaprogrammermayneedto
emulateitwithinanotherparadigm.
AnotherlogiclanguageworthlearningisminiKanren.miniKanrenstressespure(cutnotallowed)
logicprogramming.Thisconstrainthasevolvedanalternatestyleoflogicprogrammingcalled
relationalprogramming,anditgrantspropertiesnottypicallyenjoyedbyPrologprograms.
Recommendedreading

Scala
Scalaisawelldesignedfusionoffunctionalandobjectorientedprogramminglanguages.Scalais
whatJavashouldhavebeen.
BuiltatoptheJavaVirtualMachine,itiscompatiblewithexistingJavacodebases,andassuch,it
standsoutasthemostlikelysuccessortoJava.
Recommendedreading

Haskell
HaskellisthecrownjeweloftheHindleyMilnerfamilyoflanguages.
Fullyexploitinglaziness,Haskellcomesclosesttoprogramminginpuremathematicsofanymajor
programminglanguage.
Recommendedreading

ISOC++
C++isanecessaryevil.
But,sinceitmustbetaught,itmustbetaughtinfull.
Inparticular,computersciencemajorsshouldleavewithagraspofeventemplatemeta
programming.

http://matt.might.net/articles/whatcsmajorsshouldknow/

6/16

3/10/2016

Whateverycomputersciencemajorshouldknow

Recommendedreading

Assembly
Anyassemblylanguagewilldo.
Sincex86ispopular,itmightaswellbethat.
Learningcompilersisthebestwaytolearnassembly,sinceitgivesthecomputerscientistanintuitive
senseofhowhighlevelcodewillbetransformed.

Specificrecommendations
Computerscientistsshouldunderstandgenerativeprogramming(macros)lexical(anddynamic)
scopeclosurescontinuationshigherorderfunctionsdynamicdispatchsubtypingmodulesand
functorsandmonadsassemanticconceptsdistinctfromanyspecificsyntax.

Discretemathematics
Computerscientistsmusthaveasolidgraspofformallogicandofproof.Proofbyalgebraic
manipulationandbynaturaldeductionengagesthereasoningcommontoroutineprogramming
tasks.Proofbyinductionengagesthereasoningusedintheconstructionofrecursivefunctions.
Computerscientistsmustbefluentinformalmathematicalnotation,andinreasoningrigorously
aboutthebasicdiscretestructures:sets,tuples,sequences,functionsandpowersets.

Specificrecommendations
Forcomputerscientists,it'simportanttocoverreasoningabout:
trees
graphs
formallanguagesand
automata.
Studentsshouldlearnenoughnumbertheorytostudyandimplementcommoncryptographic
protocols.

Datastructuresandalgorithms
Studentsshouldcertainlyseethecommon(orrareyetunreasonablyeffective)datastructuresand
algorithms.
But,moreimportantthanknowingaspecificalgorithmordatastructure(whichisusuallyeasy
enoughtolookup),computerscientistsmustunderstandhowtodesignalgorithms(e.g.,greedy,
dynamicstrategies)andhowtospanthegapbetweenanalgorithmintheidealandthenittygrittyof
http://matt.might.net/articles/whatcsmajorsshouldknow/

7/16

3/10/2016

Whateverycomputersciencemajorshouldknow

itsimplementation.

Specificrecommendations
Ataminimum,computerscientistsseekingstablelongrunemploymentshouldknowallofthe
following:
hashtables
linkedlists
trees
binarysearchtreesand
directedandundirectedgraphs.
Computerscientistsshouldbereadytoimplementorextendanalgorithmthatoperatesonthese
datastructures,includingtheabilitytosearchforanelement,toaddanelementandtoremovean
element.
Forcompleteness,computerscientistsshouldknowboththeimperativeandfunctionalversionsof
eachalgorithm.

Theory
Agraspoftheoryisaprerequisitetoresearchingraduateschool.
Theoryisinvaluablewhenitprovideshardboundariesonaproblem(orwhenitprovidesameansof
circumventingwhatinitiallyappeartobehardboundaries).
Computationalcomplexitycanlegitimatelyclaimtobeoneofthefewtrulypredictivetheoriesinallof
computer"science."
Acomputerscientistmustknowwheretheboundariesoftractabilityandcomputabilitylie.Toignore
theselimitsinvitesfrustrationinthebestcase,andfailureintheworst.

Specificrecommendations
Attheundergraduatelevel,theoryshouldcoveratleastmodelsofcomputationandcomputational
complexity.
Modelsofcomputationshouldcoverfinitestateautomata,regularlanguages(andregular
expressions),pushdownautomata,contextfreelanguages,formalgrammars,Turingmachines,the
lambdacalculus,andundecidability.
Attheundergraduatelevel,studentsshouldlearnatleastenoughcomplexitytounderstandthe
differencebetweenP,NP,NPHardandNPComplete.
Toavoidleavingthewrongimpression,studentsshouldsolveafewlargeproblemsinNPby
http://matt.might.net/articles/whatcsmajorsshouldknow/

8/16

3/10/2016

Whateverycomputersciencemajorshouldknow

reductiontoSATandtheuseofmodernSATsolvers.

Architecture
Thereisnosubstituteforasolidunderstandingofcomputerarchitecture.
Computerscientistsshouldunderstandacomputerfromthetransistorsup.
Theunderstandingofarchitectureshouldencompassthestandardlevelsofabstraction:transistors,
gates,adders,muxes,flipflops,ALUs,controlunits,cachesandRAM.
AnunderstandingoftheGPUmodelofhighperformancecomputingwillbeimportantforthe
foreseeablefuture.

Specificrecommendations
Agoodunderstandingofcaches,busesandhardwarememorymanagementisessentialtoachieving
goodperformanceonmodernsystems.
Togetagoodgraspofmachinearchitecture,studentsshoulddesignandsimulateasmallCPU.

Operatingsystems
Anysufficientlylargeprogrameventuallybecomesanoperatingsystem.
Assuch,computerscientistsshouldbeawareofhowkernelshandlesystemcalls,paging,
scheduling,contextswitching,filesystemsandinternalresourcemanagement.
Agoodunderstandingofoperatingsystemsissecondaryonlytoanunderstandingofcompilersand
architectureforachievingperformance.
Understandingoperatingsystems(whichIwouldinterpretliberallytoincluderuntimesystems)
becomesespeciallyimportantwhenprogramminganembeddedsystemwithoutone.

Specificrecommendations
It'simportantforstudentstogettheirhandsdirtyonarealoperatingsystem.WithLinuxand
virtualization,thisiseasierthaneverbefore.
Togetabetterunderstandingofthekernel,studentscould:
print"helloworld"duringthebootprocess
designtheirownscheduler
modifythepagehandlingpolicyand
createtheirownfilesystem.

http://matt.might.net/articles/whatcsmajorsshouldknow/

9/16

3/10/2016

Whateverycomputersciencemajorshouldknow

Networking
Giventheubiquityofnetworks,computerscientistsshouldhaveafirmunderstandingofthenetwork
stackandroutingprotocolswithinanetwork.
Themechanicsofbuildinganefficient,reliabletransmissionprotocol(likeTCP)ontopofan
unreliabletransmissionprotocol(likeIP)shouldnotbemagictoacomputerscientist.Itshouldbe
coreknowledge.
Computerscientistsmustunderstandthetradeoffsinvolvedinprotocoldesignforexample,whento
chooseTCPandwhentochooseUDP.(Programmersneedtounderstandthelargersocial
implicationsforcongestionshouldtheyuseUDPatlargescalesaswell.)

Specificrecommendations
Giventhefrequencywithwhichthemodernprogrammerencountersnetworkprogramming,it's
helpfultoknowtheprotocolsforexistingstandards,suchas:
802.3and802.11
IPv4andIPv6and
DNS,SMTPandHTTP.
Computerscientistsshouldunderstandexponentialbackoffinpacketcollisionresolutionandthe
additiveincreasemultiplicativedecreasemechanisminvolvedincongestioncontrol.
Everycomputerscientistshouldimplementthefollowing:
anHTTPclientanddaemon
aDNSresolverandserverand
acommandlineSMTPmailer.
Nostudentshouldeverpassanintroneworkingclasswithoutsniffingtheirinstructor'sGooglequery
offwireshark.
It'sprobablygoingtoofartorequireallstudentstoimplementareliabletransmissionprotocolfrom
scratchatopIP,butIcansaythatitwasapersonallytransformativeexperienceformeasastudent.

Security
Thesadtruthofsecurityisthatthemajorityofsecurityvulnerabilitiescomefromsloppy
programming.Thesaddertruthisthatmanyschoolsdoapoorjoboftrainingprogrammerstosecure
theircode.
Computerscientistsmustbeawareofthemeansbywhichaprogramcanbecompromised.
Theyneedtodevelopasenseofdefensiveprogrammingamindforthinkingabouthowtheirown
http://matt.might.net/articles/whatcsmajorsshouldknow/

10/16

3/10/2016

Whateverycomputersciencemajorshouldknow

codemightbeattacked.
Securityisthekindoftrainingthatisbestdistributedthroughouttheentirecurriculum:eachdiscipline
shouldwarnstudentsofitsnativevulnerabilities.

Specificrecommendations
Ataminimum,everycomputerscientistneedstounderstand:
socialengineering
bufferoverflows
integeroverflow
codeinjectionvulnerabilities
raceconditionsand
privilegeconfusion.
AfewreadershavepointedoutthatcomputerscientistsalsoneedtobeawareofbasicITsecurity
measures,suchhowtochooselegitimatelygoodpasswordsandhowtoproperlyconfigureafirewall
withiptables.

Cryptography
Cryptographyiswhatmakesmuchofourdigitallivespossible.
Computerscientistsshouldunderstandandbeabletoimplementthefollowingconcepts,aswellas
thecommonpitfallsindoingso:
symmetrickeycryptosystems
publickeycryptosystems
securehashfunctions
challengeresponseauthentication
digitalsignaturealgorithmsand
thresholdcryptosystems.
Sinceit'sacommonfaultinimplementationsofcryptosystems,everycomputerscientistshouldknow
howtoacquireasufficientlyrandomnumberforthetaskathand.
Attheveryleast,asnearlyeverydatabreachhasshown,computerscientistsneedtoknowhowto
saltandhashpasswordsforstorage.

Specificrecommendations
Everycomputerscientistshouldhavethepleasureofbreakingciphertextusingpremodern
cryptosystemswithhandrolledstatisticaltools.
RSAiseasyenoughtoimplementthateveryoneshoulddoit.
http://matt.might.net/articles/whatcsmajorsshouldknow/

11/16

3/10/2016

Whateverycomputersciencemajorshouldknow

Everystudentshouldcreatetheirowndigitalcertificateandsetuphttpsinapache.(It'ssurprisingly
arduoustodothis.)
StudentshouldalsowriteaconsolewebclientthatconnectsoverSSL.
Asstrictlypracticalmatters,computerscientistsshouldknowhowtouseGPGhowtousepublickey
authenticationforsshandhowtoencryptadirectoryoraharddisk.
Recommendedreading

Softwaretesting
Softwaretestingmustbedistributedthroughouttheentirecurriculum.
Acourseonsoftwareengineeringcancoverthebasicstylesoftesting,butthere'snosubstitutefor
practicingtheart.
Studentsshouldbegradedonthetestcasestheyturnin.
Iusetestcasesturnedinbystudentsagainstallotherstudents.
Studentsdon'tseemtocaremuchaboutdevelopingdefensivetestcases,buttheyunleashhellwhen
itcomestosandbaggingtheirclassmates.

Userexperiencedesign
Programmerstoooftenwritesoftwareforotherprogrammers,orworse,forthemselves.
Userinterfacedesign(ormorebroadly,userexperiencedesign)mightbethemostunderappreciated
aspectofcomputerscience.
There'samisconception,evenamongprofessors,thatuserexperienceisa"soft"skillthatcan'tbe
taught.
Inreality,modernuserexperiencedesignisanchoredinempiricallywroughtprinciplesfromhuman
factorsengineeringandindustrialdesign.
Ifnothingelse,computerscientistsshouldknowthatinterfacesneedtomaketheeaseofexecuting
anytaskproportionaltothefrequencyofthetaskmultipliedbyitsimportance.
Asapracticality,everyprogrammershouldbecomfortablewithdesigningusablewebinterfacesin
HTML,CSSandJavaScript.

Visualization
Goodvisualizationisaboutrenderingdatainsuchafashionthatsuchthathumansperceiveitas
http://matt.might.net/articles/whatcsmajorsshouldknow/

12/16

3/10/2016

Whateverycomputersciencemajorshouldknow

information.Thisisnotaneasythingtodo.
Themodernworldisaseaofdata,andexploitingthelocalmaximaofhumanperceptioniskeyto
makingsenseofit.

Parallelism
Parallelismisback,anduglierthanever.
Theunfortunatetruthisthatharnessingparallelismrequiresdeepknowledgeofarchitecture:
multicore,caches,buses,GPUs,etc.
And,practice.Lotsofpractice.

Specificrecommendations
Itisnotatallclearwhatthe"final"answeronparallelprogrammingis,butafewdomainspecific
solutionshaveemerged.
Fornow,studentsshouldlearnCUDAandOpenCL.
Threadsareaflimsyabstractionforparallelism,particularlywhencachesandcachecoherencyare
involved.But,threadsarepopularandtricky,soworthlearning.Pthreadsisareasonablyportable
threadslibrarytolearn.
Foranyoneinterestedinlargescaleparallelism,MPIisaprerequisite.
Ontheprinciplesside,itdoesseemthatmapreduceisenduring.

Softwareengineering
Theprinciplesinsoftwareengineeringchangeaboutasfastastheprogramminglanguagesdo.
Agood,handsoncourseinthepracticeofteamsoftwareconstructionprovidesaworkingknowledge
ofthepitfallsinherentintheendeavor.
It'sbeenrecommendedbyseveralreadersthatstudentsbreakupintoteamsofthree,withtherole
ofleaderrotatingthroughthreedifferentprojects.
Learninghowtoattackandmaneuverthroughalargeexistingcodebaseisaskillmostprogrammers
willhavetomaster,andit'sonebestlearnedinschoolinsteadofonthejob.

Specificrecommendations
Allstudentsneedtounderstandcentralizedversioncontrolsystemslikesvnanddistributedversion
controlsystemslikegit.
http://matt.might.net/articles/whatcsmajorsshouldknow/

13/16

3/10/2016

Whateverycomputersciencemajorshouldknow

Aworkingknowlegeofdebuggingtoolslikegdbandvalgrindgoesalongwaywhentheyfinally
becomenecessary.

Formalmethods
Asthedemandsonsecure,reliablesoftwareincrease,formalmethodsmayonedayendupasthe
onlymeansfordeliveringit.
Atpresent,formalmodelingandverificationofsoftwareremainschallenging,butprogressinthefield
issteady:itgetseasiereveryyear.
Theremayevencomeadaywithinthelifetimeoftoday'scomputersciencemajorswhereformal
softwareconstructionisanexpectedskill.
Everycomputerscientistshouldbeatleastmoderatelycomfortableusingonetheoremprover.(I
don'tthinkitmatterswhichone.)
Learningtouseatheoremproverimmediatelyimpactscodingstyle.
Forexample,onefeelsinstinctivelyallergictowritingamatchorswitchstatementthatdoesn't
coverallpossibilities.
And,whenwritingrecursivefunctions,usersoftheoremprovershaveastrongurgetoeliminateill
foundedness.

Graphicsandsimulation
Thereisnodisciplinemoredominatedby"clever"thangraphics.
Thefieldisdriventoward,evendefinedby,the"goodenough."
Assuch,thereisnobetterwaytoteachcleverprogrammingorasolidappreciationofoptimizing
effortthangraphicsandsimulation.
OverhalfofthecodinghacksI'velearnedcamefrommystudyofgraphics.

Specificrecommendations
Simpleraytracerscanbeconstructedinunder100linesofcode.
It'sgoodmentalhygienetoworkoutthetransformationsnecessarytoperformaperspective3D
projectioninawireframe3Dengine.
DatastructureslikeBSPtreesandalgorithmslikezbufferrenderingaregreatexamplesofclever
design.

http://matt.might.net/articles/whatcsmajorsshouldknow/

14/16

3/10/2016

Whateverycomputersciencemajorshouldknow

Ingraphicsandsimulation,therearemanymore.

Robotics
Roboticsmaybeoneofthemostengagingwaystoteachintroductoryprogramming.
Moreover,asthecostofroboticscontinuestofall,thresholdsarebeingpassedwhichwillenablea
personalroboticsrevolution.
Forthosethatcanprogram,unimaginabledegreesofpersonalphysicalautomationareonthe
horizon.

Artificialintelligence
Iffornootherreasonthanitsoutsizedimpactontheearlyhistoryofcomputing,computerscientists
shouldstudyartificialintelligence.
Whiletheoriginaldreamofintelligentmachinesseemsfaroff,artificialintelligencespurredanumber
ofpracticalfields,suchasmachinelearning,dataminingandnaturallanguageprocessing.

Machinelearning
Asidefromitsoutstandingtechnicalmerits,thesheernumberofjobopeningsfor"relevance
engineer,"indicatesthateverycomputerscientistshouldgraspthefundamentalsofmachine
learning.
Machinelearningdoublyemphasizestheneedforanunderstandingofprobabilityandstatistics.

Specificrecommendations
Attheundergraduatelevel,coreconceptsshouldincludeBayesiannetworks,clusteringanddecision
treelearning.

Databases
Databasesaretoocommonandtoousefultoignore.
It'susefultounderstandthefundamentaldatastructuresandalgorithmsthatpoweradatabase
engine,sinceprogrammersoftenenoughreimplementadatabasesystemwithinalargersoftware
system.
RelationalalgebraandrelationalcalculusstandoutasexceptionalsuccessstoriesinsubTuring
modelsofcomputation.
UnlikeUMLmodeling,ERmodelingseemstobeareasonablemechanismforvisualingencodingthe
http://matt.might.net/articles/whatcsmajorsshouldknow/

15/16

3/10/2016

Whateverycomputersciencemajorshouldknow

designofandconstraintsuponasoftwareartifact.

Specificrecommendations
AcomputerscientistthatcansetupandoperateaLAMPstackisonegoodideaandalotofhard
workawayfromrunningtheirowncompany.

Whatelse?
Mysuggestionsarelimitedbyblindspotsinmyownknowledge.
WhathaveInotlistedherethatshouldbeincluded?

http://matt.might.net/articles/whatcsmajorsshouldknow/

16/16

You might also like