Professional Documents
Culture Documents
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