1<!DOCTYPE html><html lang="en" class="" style="scroll-padding:60px"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><title>Introductions and motivation - SE4Sci</title><meta property="og:title" content="Introductions and motivation - SE4Sci"/><meta name="generator" content="mystmd"/><meta name="keywords" content=""/><meta name="image" content="/build/33087fc734ac83f22a4799d311ccedca.png"/><meta property="og:image" content="/build/33087fc734ac83f22a4799d311ccedca.png"/><link rel="icon" href="/favicon.ico"/><link rel="modulepreload" href="/build/entry.client-NNNALS5X.js"/><link rel="modulepreload" href="/build/_shared/chunk-UBXX7P26.js"/><link rel="modulepreload" href="/build/_shared/chunk-KB7LMXDF.js"/><link rel="modulepreload" href="/build/_shared/chunk-RAQ24GF6.js"/><link rel="modulepreload" href="/build/_shared/chunk-LS4ALTVG.js"/><link rel="modulepreload" href="/build/_shared/chunk-7FWBVTMU.js"/><link rel="modulepreload" href="/build/_shared/chunk-7YIJOVKB.js"/><link rel="modulepreload" href="/build/_shared/chunk-MCEKF3CD.js"/><link rel="modulepreload" href="/build/_shared/chunk-BVQ4IR5U.js"/><link rel="modulepreload" href="/build/_shared/chunk-EVF4GZYD.js"/><link rel="modulepreload" href="/build/_shared/chunk-6LPWM5X2.js"/><link rel="modulepreload" href="/build/_shared/chunk-WNVPCTL5.js"/><link rel="modulepreload" href="/build/_shared/chunk-IZ3HLG6T.js"/><link rel="modulepreload" href="/build/_shared/chunk-TBCV2LPN.js"/><link rel="modulepreload" href="/build/_shared/chunk-SWBLOF4V.js"/><link rel="modulepreload" href="/build/_shared/chunk-J56WUMNK.js"/><link rel="modulepreload" href="/build/root-C5CK33H3.js"/><link rel="modulepreload" href="/build/_shared/chunk-WGW5MSUV.js"/><link rel="modulepreload" href="/build/routes/$-6ALOT4PW.js"/><link rel="stylesheet" href="/build/_assets/app-XNK7MHNS.css"/><link rel="stylesheet" href="/build/_assets/thebe-core-VKVHG5VY.css"/><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/css/mpl_widget.css"/><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css"/><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css" integrity="sha384-MlJdn/WNKDGXveldHDdyRP1R4CTHr3FeuDNfhsLPYrq2t0UBkUdK2jyTnXPEK1NQ" crossorigin="anonymous"/><link rel="stylesheet" href="/myst-theme.css"/>
1<script> 2 const savedTheme = localStorage.getItem("myst:theme"); 3 const theme = window.matchMedia("(prefers-color-scheme: light)").matches ? 'light' : 'dark'; 4 const classes = document.documentElement.classList; 5 const hasAnyTheme = classes.contains('light') || classes.contains('dark'); 6 if (!hasAnyTheme) classes.add(savedTheme ?? theme); 7</script>
7<script>(function(){var p=window.location.pathname;if(p.endsWith('/index.html'))window.location.replace((p.slice(0,-10)||'/')+window.location.search+window.location.hash);})();</script>
7</head><body class="m-0 bg-myst-bg"><div class="myst-skip-to-article fixed top-1 left-1 h-[0px] w-[0px] focus-within:z-40 focus-within:h-auto focus-within:w-auto bg-myst-bg overflow-hidden focus-within:p-2 focus-within:ring-1" aria-label="skip to content options"><a href="#skip-to-frontmatter" class="myst-skip-to-link block px-2 py-1 text-myst-text underline">Skip to article frontmatter</a><a href="#skip-to-article" class="myst-skip-to-link block px-2 py-1 text-myst-text underline">Skip to article content</a></div><dialog id="myst-no-css" style="position:fixed;left:0px;top:0px;width:100%;height:100vh;font-size:4rem;padding:1rem;color:black;background:white"><strong>Site not loading correctly?</strong><p>This may be due to an incorrect <code>BASE_URL</code> configuration. See<!-- --> <a href="https://mystmd.org/guide/deployment#deploy-base-url">the MyST Documentation</a> <!-- -->for reference.</p>
7<script> 8 (() => { 9 // Test for has-styling variable set by the MyST stylesheet 10 const node = document.currentScript.parentNode; 11 const hasCSS = window.getComputedStyle(node).getPropertyValue("--has-styling"); 12 if (hasCSS === ""){ 13 node.showModal(); 14 } 15 16 })() 17</script>
17</dialog><div class="myst-top-nav myst-bg-translucent backdrop-blur shadow dark:shadow-2xl p-3 md:px-8 sticky w-full top-0 z-30 min-h-[60px]"><nav class="myst-top-nav-bar flex items-center justify-between flex-nowrap max-w-[1440px] mx-auto"><div class="flex flex-row xl:min-w-[19.5rem] mr-2 sm:mr-7 justify-start items-center shrink-0"><div class="block xl:hidden"><button class="myst-top-nav-menu-button flex items-center justify-center border-myst-border-strong text-myst-text-secondary hover:text-myst-text w-10 h-10"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" width="1.5rem" height="1.5rem"><path fill-rule="evenodd" d="M3 6.75A.75.75 0 0 1 3.75 6h16.5a.75.75 0 0 1 0 1.5H3.75A.75.75 0 0 1 3 6.75ZM3 12a.75.75 0 0 1 .75-.75h16.5a.75.75 0 0 1 0 1.5H3.75A.75.75 0 0 1 3 12Zm0 5.25a.75.75 0 0 1 .75-.75h16.5a.75.75 0 0 1 0 1.5H3.75a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg><span class="sr-only">Open Menu</span></button></div><a class="myst-home-link flex items-center ml-3 text-myst-text w-fit md:ml-5 xl:ml-7" href="/"><span class="text-md sm:text-xl tracking-tight sm:mr-5">Made with MyST</span></a></div><div class="flex items-center flex-grow w-auto"><div class="flex-grow hidden text-md lg:block"><div class="myst-top-nav-item relative inline-block mx-2 grow-0"><a href="https://github.com/se-for-sci/se-for-sci.github.io" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center w-full mx-2 py-1 text-md font-medium text-myst-text hover:text-myst-active focus:outline-none focus-visible:ring-2 focus-visible:ring-myst-focus-ring focus-visible:ring-opacity-75">Source</a></div><div class="myst-top-nav-item relative inline-block mx-2 grow-0"><a href="https://se-for-sci.github.io/live" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center w-full mx-2 py-1 text-md font-medium text-myst-text hover:text-myst-active focus:outline-none focus-visible:ring-2 focus-visible:ring-myst-focus-ring focus-visible:ring-opacity-75">WebAssembly</a></div><div class="myst-top-nav-item relative inline-block mx-2 grow-0"><a href="https://mybinder.org/v2/gh/se-for-sci/se-for-sci.github.io/main?urlpath=lab" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center w-full mx-2 py-1 text-md font-medium text-myst-text hover:text-myst-active focus:outline-none focus-visible:ring-2 focus-visible:ring-myst-focus-ring focus-visible:ring-opacity-75">Binder</a></div></div><div class="flex-grow block"></div><button type="button" aria-haspopup="dialog" aria-expanded="false" data-state="closed" class="myst-search-bar flex items-center h-10 aspect-square sm:w-64 text-left text-myst-text-secondary border border-myst-border-strong rounded-lg bg-myst-bg-secondary dark:bg-myst-surface-hover myst-search-bar-disabled hover:ring-myst-focus-ring hover:border-myst-focus-ring"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="p-2.5 h-10 w-10 aspect-square"><path fill-rule="evenodd" d="M10.5 3.75a6.75 6.75 0 1 0 0 13.5 6.75 6.75 0 0 0 0-13.5ZM2.25 10.5a8.25 8.25 0 1 1 14.59 5.28l4.69 4.69a.75.75 0 1 1-1.06 1.06l-4.69-4.69A8.25 8.25 0 0 1 2.25 10.5Z" clip-rule="evenodd"></path></svg><span class="myst-search-text-placeholder hidden sm:block grow">Search</span><div aria-hidden="true" class="myst-search-shortcut items-center hidden mx-1 font-mono text-sm text-myst-text-secondary sm:flex gap-x-1"><kbd class="px-2 py-1 border border-myst-border-strong rounded-md shadow-[0px_2px_0px_0px_rgba(0,0,0,0.08)] dark:shadow-none hide-mac">CTRL</kbd><kbd class="px-2 py-1 border border-myst-border-strong rounded-md shadow-[0px_2px_0px_0px_rgba(0,0,0,0.08)] dark:shadow-none show-mac">â</kbd><kbd class="px-2 py-1 border border-myst-border-strong rounded-md shadow-[0px_2px_0px_0px_rgba(0,0,0,0.08)] dark:shadow-none ">K</kbd>
17<script> 18;(() => { 19const script = document.currentScript; 20const root = script.parentElement; 21 22const isMac = /mac/i.test( 23 window.navigator.userAgentData?.platform ?? window.navigator.userAgent, 24 ); 25root.querySelectorAll(".hide-mac").forEach(node => {node.classList.add(isMac ? "hidden" : "block")}); 26root.querySelectorAll(".show-mac").forEach(node => {node.classList.add(!isMac ? "hidden" : "block")}); 27})()</script>
27</div></button><button class="myst-theme-button theme shrink-0 rounded-full border border-myst-border-strong hover:bg-myst-surface border-solid overflow-hidden text-myst-text-secondary w-8 h-8 ml-3" title="Toggle theme between light and dark mode" aria-label="Toggle theme between light and dark mode"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="myst-theme-moon-icon h-full w-full p-[18%] hidden dark:block"><path fill-rule="evenodd" d="M9.528 1.718a.75.75 0 0 1 .162.819A8.97 8.97 0 0 0 9 6a9 9 0 0 0 9 9 8.97 8.97 0 0 0 3.463-.69.75.75 0 0 1 .981.98 10.503 10.503 0 0 1-9.694 6.46c-5.799 0-10.5-4.7-10.5-10.5 0-4.368 2.667-8.112 6.46-9.694a.75.75 0 0 1 .818.162Z" clip-rule="evenodd"></path></svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="myst-theme-sun-icon h-full w-full p-[18%] dark:hidden"><path d="M12 2.25a.75.75 0 0 1 .75.75v2.25a.75.75 0 0 1-1.5 0V3a.75.75 0 0 1 .75-.75ZM7.5 12a4.5 4.5 0 1 1 9 0 4.5 4.5 0 0 1-9 0ZM18.894 6.166a.75.75 0 0 0-1.06-1.06l-1.591 1.59a.75.75 0 1 0 1.06 1.061l1.591-1.59ZM21.75 12a.75.75 0 0 1-.75.75h-2.25a.75.75 0 0 1 0-1.5H21a.75.75 0 0 1 .75.75ZM17.834 18.894a.75.75 0 0 0 1.06-1.06l-1.59-1.591a.75.75 0 1 0-1.061 1.06l1.59 1.591ZM12 18a.75.75 0 0 1 .75.75V21a.75.75 0 0 1-1.5 0v-2.25A.75.75 0 0 1 12 18ZM7.758 17.303a.75.75 0 0 0-1.061-1.06l-1.591 1.59a.75.75 0 0 0 1.06 1.061l1.591-1.59ZM6 12a.75.75 0 0 1-.75.75H3a.75.75 0 0 1 0-1.5h2.25A.75.75 0 0 1 6 12ZM6.697 7.757a.75.75 0 0 0 1.06-1.06l-1.59-1.591a.75.75 0 0 0-1.061 1.06l1.59 1.591Z"></path></svg></button><div class="block sm:hidden"></div><div class="hidden sm:block"></div></div></nav></div><div class="myst-primary-sidebar fixed xl:article-grid grid-gap xl:w-full xl:pointer-events-none overflow-auto max-xl:w-[75vw] max-xl:max-w-[350px] max-xl:!top-0 max-xl:h-screen hidden z-10" style="top:60px"><div class="myst-primary-sidebar-pointer pointer-events-auto xl:col-margin-left flex-col overflow-hidden max-xl:h-full hidden xl:flex"><div class="myst-primary-sidebar-nav flex-grow py-6 overflow-y-auto primary-scrollbar"><nav aria-label="Navigation" class="myst-primary-sidebar-topnav overflow-y-hidden transition-opacity lg:hidden ml-3 xl:ml-0 mr-3 max-w-[350px]"><div class="w-full px-1 text-myst-text font-medium"><a href="https://github.com/se-for-sci/se-for-sci.github.io" target="_blank" rel="noopener noreferrer" class="myst-primary-sidebar-item-short p-2 my-1 rounded-lg hover:bg-myst-surface block break-words focus:outline outline-myst-focus-outline outline-2 rounded">Source</a><a href="https://se-for-sci.github.io/live" target="_blank" rel="noopener noreferrer" class="myst-primary-sidebar-item-short p-2 my-1 rounded-lg hover:bg-myst-surface block break-words focus:outline outline-myst-focus-outline outline-2 rounded">WebAssembly</a><a href="https://mybinder.org/v2/gh/se-for-sci/se-for-sci.github.io/main?urlpath=lab" target="_blank" rel="noopener noreferrer" class="myst-primary-sidebar-item-short p-2 my-1 rounded-lg hover:bg-myst-surface block break-words focus:outline outline-myst-focus-outline outline-2 rounded">Binder</a></div></nav><div class="my-3 border-b-2 lg:hidden"></div><nav aria-label="Table of Contents" class="myst-primary-sidebar-toc flex-grow overflow-y-hidden transition-opacity ml-3 xl:ml-0 mr-3 max-w-[350px]"><div class="myst-toc w-full px-1 text-myst-text"><a title="Software Engineering For Scientific Computing" class="block break-words focus:outline outline-myst-focus-outline outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-myst-surface font-bold" href="/">Software Engineering For Scientific Computing</a><div data-state="open" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-myst-surface"><div title="Week 0: Intro" class="block break-words rounded py-2 grow font-semibold text-myst-accent-text cursor-pointer">Week 0: Intro</div>
27<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-myst-surface focus-visible:outline outline-myst-focus-outline outline-2" aria-label="Open Folder" type="button" aria-controls="radix-_R_18psp_" aria-expanded="true" data-state="open"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-myst-text-secondary" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="open" id="radix-_R_18psp_" class="pl-3 pr-[2px] collapsible-content" style="animation:none"><a title="Introductions and motivation" aria-current="page" class="block break-words focus:outline outline-myst-focus-outline outline-2 rounded myst-toc-item p-2 my-1 rounded-lg myst-toc-item-exact bg-myst-active-bg active" href="/intro">Introductions and motivation</a><a title="Unix setup and tools" class="block break-words focus:outline outline-myst-focus-outline outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-myst-surface" href="/setup">Unix setup and tools</a><a title="Version control overview" class="block break-words focus:outline outline-myst-focus-outline outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-myst-surface" href="/vcs">Version control overview</a><a title="Programming basics" class="block break-words focus:outline outline-myst-focus-outline outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-myst-surface" href="/programming-basics">Programming basics</a><a title="Programming/style general practices" class="block break-words focus:outline outline-myst-focus-outline outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-myst-surface" href="/practices">Programming/style general practices</a><a title="Code cleanup example" class="block break-words focus:outline outline-myst-focus-outline outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-myst-surface" href="/cleanup-bessel">Code cleanup example</a><a title="Python Setup" class="block break-words focus:outline outline-myst-focus-outline outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-myst-surface" href="/python-setup">Python Setup</a></div></div><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-myst-surface"><div title="Week 1: Version Control" class="block break-words rounded py-2 grow cursor-pointer">Week 1: Version Control</div>
27<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-myst-surface focus-visible:outline outline-myst-focus-outline outline-2" aria-label="Open Folder" type="button" aria-controls="radix-_R_1opsp_" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-myst-text-secondary" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-_R_1opsp_" hidden="" class="pl-3 pr-[2px] collapsible-content" style="animation:none"></div></div><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-myst-surface"><div title="Week 2: Agentic AI" class="block break-words rounded py-2 grow cursor-pointer">Week 2: Agentic AI</div>
27<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-myst-surface focus-visible:outline outline-myst-focus-outline outline-2" aria-label="Open Folder" type="button" aria-controls="radix-_R_28psp_" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-myst-text-secondary" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-_R_28psp_" hidden="" class="pl-3 pr-[2px] collapsible-content" style="animation:none"></div></div><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-myst-surface"><div title="Week 3: Testing" class="block break-words rounded py-2 grow cursor-pointer">Week 3: Testing</div>
27<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-myst-surface focus-visible:outline outline-myst-focus-outline outline-2" aria-label="Open Folder" type="button" aria-controls="radix-_R_2opsp_" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-myst-text-secondary" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-_R_2opsp_" hidden="" class="pl-3 pr-[2px] collapsible-content" style="animation:none"></div></div><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-myst-surface"><div title="Week 4: Packaging and Quality Control" class="block break-words rounded py-2 grow cursor-pointer">Week 4: Packaging and Quality Control</div>
27<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-myst-surface focus-visible:outline outline-myst-focus-outline outline-2" aria-label="Open Folder" type="button" aria-controls="radix-_R_38psp_" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-myst-text-secondary" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-_R_38psp_" hidden="" class="pl-3 pr-[2px] collapsible-content" style="animation:none"></div></div><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-myst-surface"><div title="Week 5: Continuous Integration" class="block break-words rounded py-2 grow cursor-pointer">Week 5: Continuous Integration</div>
27<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-myst-surface focus-visible:outline outline-myst-focus-outline outline-2" aria-label="Open Folder" type="button" aria-controls="radix-_R_3opsp_" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-myst-text-secondary" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-_R_3opsp_" hidden="" class="pl-3 pr-[2px] collapsible-content" style="animation:none"></div></div><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-myst-surface"><div title="Week 6: Compiled Languages" class="block break-words rounded py-2 grow cursor-pointer">Week 6: Compiled Languages</div>
27<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-myst-surface focus-visible:outline outline-myst-focus-outline outline-2" aria-label="Open Folder" type="button" aria-controls="radix-_R_48psp_" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-myst-text-secondary" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-_R_48psp_" hidden="" class="pl-3 pr-[2px] collapsible-content" style="animation:none"></div></div><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-myst-surface"><div title="Week 7: Parallel Computing" class="block break-words rounded py-2 grow cursor-pointer">Week 7: Parallel Computing</div>
27<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-myst-surface focus-visible:outline outline-myst-focus-outline outline-2" aria-label="Open Folder" type="button" aria-controls="radix-_R_4opsp_" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-myst-text-secondary" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-_R_4opsp_" hidden="" class="pl-3 pr-[2px] collapsible-content" style="animation:none"></div></div><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-myst-surface"><div title="WIP: Week 8: GPU Programming" class="block break-words rounded py-2 grow cursor-pointer">WIP: Week 8: GPU Programming</div>
27<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-myst-surface focus-visible:outline outline-myst-focus-outline outline-2" aria-label="Open Folder" type="button" aria-controls="radix-_R_58psp_" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-myst-text-secondary" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-_R_58psp_" hidden="" class="pl-3 pr-[2px] collapsible-content" style="animation:none"></div></div><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-myst-surface"><div title="Week 9: Mixing Languages" class="block break-words rounded py-2 grow cursor-pointer">Week 9: Mixing Languages</div>
27<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-myst-surface focus-visible:outline outline-myst-focus-outline outline-2" aria-label="Open Folder" type="button" aria-controls="radix-_R_5opsp_" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-myst-text-secondary" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-_R_5opsp_" hidden="" class="pl-3 pr-[2px] collapsible-content" style="animation:none"></div></div><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-myst-surface"><div title="Week 10: Object Oriented design" class="block break-words rounded py-2 grow cursor-pointer">Week 10: Object Oriented design</div>
27<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-myst-surface focus-visible:outline outline-myst-focus-outline outline-2" aria-label="Open Folder" type="button" aria-controls="radix-_R_68psp_" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-myst-text-secondary" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-_R_68psp_" hidden="" class="pl-3 pr-[2px] collapsible-content" style="animation:none"></div></div><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-myst-surface"><div title="Week 11: Design Patterns" class="block break-words rounded py-2 grow cursor-pointer">Week 11: Design Patterns</div>
27<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-myst-surface focus-visible:outline outline-myst-focus-outline outline-2" aria-label="Open Folder" type="button" aria-controls="radix-_R_6opsp_" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-myst-text-secondary" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-_R_6opsp_" hidden="" class="pl-3 pr-[2px] collapsible-content" style="animation:none"></div></div><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-myst-surface"><div title="Week 12: Static Typing" class="block break-words rounded py-2 grow cursor-pointer">Week 12: Static Typing</div>
27<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-myst-surface focus-visible:outline outline-myst-focus-outline outline-2" aria-label="Open Folder" type="button" aria-controls="radix-_R_78psp_" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-myst-text-secondary" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-_R_78psp_" hidden="" class="pl-3 pr-[2px] collapsible-content" style="animation:none"></div></div><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-myst-surface"><div title="Bonus: Exotic topics" class="block break-words rounded py-2 grow cursor-pointer">Bonus: Exotic topics</div>
27<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-myst-surface focus-visible:outline outline-myst-focus-outline outline-2" aria-label="Open Folder" type="button" aria-controls="radix-_R_7opsp_" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-myst-text-secondary" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-_R_7opsp_" hidden="" class="pl-3 pr-[2px] collapsible-content" style="animation:none"></div></div></div></nav></div><div class="myst-primary-sidebar-footer flex-none py-6 transition-all duration-700 translate-y-6 opacity-0 ml-3 xl:ml-0 mr-3 max-w-[350px]"><a class="myst-made-with-myst flex mx-auto text-myst-text-secondary w-fit hover:text-myst-link" href="https://mystmd.org/made-with-myst" target="_blank" rel="noreferrer"><svg style="width:24px;height:24px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" stroke="none"><g id="icon"><path fill="currentColor" d="M23.8,54.8v-3.6l4.7-0.8V17.5l-4.7-0.8V13H36l13.4,31.7h0.2l13-31.7h12.6v3.6l-4.7,0.8v32.9l4.7,0.8v3.6h-15 28 v-3.6l4.9-0.8V20.8H65L51.4,53.3h-3.8l-14-32.5h-0.1l0.2,17.4v12.1l5,0.8v3.6H23.8z"></path><path fill="#F37726" d="M47,86.9c0-5.9-3.4-8.8-10.1-8.8h-8.4c-5.2,0-9.4-1.3-12.5-3.8c-3.1-2.5-5.4-6.2-6.8-11l4.8-1.6 29 c1.8,5.6,6.4,8.6,13.8,8.8h9.2c6.4,0,10.8,2.5,13.1,7.5c2.3-5,6.7-7.5,13.1-7.5h8.4c7.8,0,12.7-2.9,14.6-8.7l4.8,1.6 30 c-1.4,4.9-3.6,8.6-6.8,11.1c-3.1,2.5-7.3,3.7-12.4,3.8H63c-6.7,0-10,2.9-10,8.8"></path></g></svg>
30<span class="self-center ml-2 text-sm">Made with MyST</span></a></div></div></div><main class="article-grid grid-gap"><article class="article-grid subgrid-gap col-screen article content"><div class="hidden"></div><div id="skip-to-frontmatter" aria-label="article frontmatter" class="myst-fm-block mb-8 pt-9"><div class="myst-fm-block-header flex items-center mb-5 h-6 text-sm font-light"><div class="flex-grow"></div><div class="myst-fm-block-badges"><a href="https://github.com/se-for-sci/se-for-sci.github.io" title="GitHub Repository: se-for-sci/se-for-sci.github.io" target="_blank" rel="noopener noreferrer" class="myst-fm-github-link text-inherit hover:text-inherit"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" width="1.25rem" height="1.25rem" class="myst-fm-github-icon inline-block mr-1 opacity-60 hover:opacity-100"><path d="M12 2.5c-5.4 0-9.8 4.4-9.8 9.7 0 4.3 2.8 8 6.7 9.2.5.1.7-.2.7-.5v-1.8c-2.4.5-3.1-.6-3.3-1.1-.1-.3-.6-1.1-1-1.4-.3-.2-.8-.6 0-.6s1.3.7 1.5 1c.9 1.5 2.3 1.1 2.8.8.1-.6.3-1.1.6-1.3-2.2-.2-4.4-1.1-4.4-4.8 0-1.1.4-1.9 1-2.6-.1-.2-.4-1.2.1-2.6 0 0 .8-.3 2.7 1 .8-.2 1.6-.3 2.4-.3.8 0 1.7.1 2.4.3 1.9-1.3 2.7-1 2.7-1 .5 1.3.2 2.3.1 2.6.6.7 1 1.5 1 2.6 0 3.7-2.3 4.6-4.4 4.8.4.3.7.9.7 1.8V21c0 .3.2.6.7.5 3.9-1.3 6.6-4.9 6.6-9.2 0-5.4-4.4-9.8-9.8-9.8z"></path></svg></a></div><a href="https://github.com/se-for-sci/se-for-sci.github.io/edit/main/content/week00_intro/intro.md" title="Edit This Page" target="_blank" rel="noopener noreferrer" class="myst-fm-edit-link text-inherit hover:text-inherit"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" width="1.25rem" height="1.25rem" class="myst-fm-edit-icon inline-block mr-1 opacity-60 hover:opacity-100"><path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0 1 15.75 21H5.25A2.25 2.25 0 0 1 3 18.75V8.25A2.25 2.25 0 0 1 5.25 6H10"></path></svg></a><div class="myst-fm-downloads-dropdown relative flex inline-block mx-1 grow-0" data-headlessui-state=""><button class="myst-fm-downloads-button relative ml-2 -mr-1" id="headlessui-menu-button-_R_s8ucp_" type="button" aria-haspopup="menu" aria-expanded="false" data-headlessui-state=""><span class="sr-only">Downloads</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" width="1.25rem" height="1.25rem" class="myst-fm-downloads-icon stroke-myst-text-tertiary hover:stroke-myst-text"><title>Download</title><path stroke-linecap="round" stroke-linejoin="round" d="M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3"></path></svg></button></div></div><h1 class="myst-fm-block-title mb-0">Introductions and motivation</h1><header class="myst-fm-authors-affiliations mt-4 not-prose"><div class="myst-fm-authors-list"><span class="myst-fm-author font-semibold text-sm myst-fm-author-item inline-block myst-fm-author-comma text-comma"><button class="myst-fm-author-popover focus:shadow-[0_0_0_2px] focus:shadow-black outline-none hover:underline" aria-label="Author Details" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="radix-_R_b8ucp_" data-state="closed"><span class="myst-fm-author-name">Henry Schreiner</span></button></span><span class="myst-fm-author font-semibold text-sm myst-fm-author-item inline-block"><button class="myst-fm-author-popover focus:shadow-[0_0_0_2px] focus:shadow-black outline-none hover:underline" aria-label="Author Details" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="radix-_R_d8ucp_" data-state="closed"><span class="myst-fm-author-name">Romain Teyssier</span></button></span></div></header></div><div class="block my-10 lg:sticky lg:z-10 lg:h-0 lg:pt-0 lg:my-0 lg:ml-10 lg:col-margin-right" style="top:60px"><nav></nav></div><div id="skip-to-article"></div><p><a target="_blank" rel="noreferrer" href="https://se-for-sci.github.io/slides/week-00-1" class="link whitespace-nowrap button"><span class="link-text whitespace-normal">Slides</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" class="link-icon"><path stroke-linecap="round" stroke-linejoin="round" d="M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25"></path></svg></a></p><h2 id="the-importance-of-software-engineering-in-scientific-computing" class="relative group"><span class="heading-text">The importance of software engineering in scientific computing</span><a class="no-underline text-inherit hover:text-inherit inline-block w-0 px-0 translate-x-[10px] font-normal select-none transition-opacity opacity-0 focus:opacity-100 group-hover:opacity-70" href="#the-importance-of-software-engineering-in-scientific-computing" title="Link to this Section" aria-label="Link to this Section">¶</a></h2><p>Itâs really easy to learn to code. In fact, itâs easier to <em>write</em> code than 31<em>read</em> code. Often this leads to the desire to rewrite legacy codebase
31s instead 32of deciphering what the original author intended. Since a main goal of good 33software engineering is to reuse code, this is clearly wasteful! Good code is 34easy to read, always strive for readability.</p><p>What does someone working on code spend time on? Rewriting code that others have 35already written. The action of rewriting code to improve its readability or 36performance without changing how it operates is commonly called refactoring. 37Other reasons to rewrite code are because it didnât scale or was not flexible 38enough. It also can feel like you spend a lot of time debugging. Lots of painful 39debugging. Having strong unit tests and using version control can simplify or 40eliminate some debugging problems.</p><p>There are a lot of tools, practices, and techniques available to help you read 41other peopleâs code, write code that others can read (including yourself in six 42months), manage scale and flexibility, and make debugging easier.</p><p>But deadlines get in the way. Your PI cares about results, not how maintainable 43your codebase is. Learning new tools to accelerate your development doesnât fit 44into tight schedules or isnât seen as necessary at the beginning of a project. 45Frequently, a small script will morph and evolve into a full codebase without 46much planning or design. Itâs much easier just to get something working than 47study design principles. You pay the price in the end, when trying to publish, 48distribute, or replicate your results.</p><p>This course aims to fix that by providing a structured introduction to common, 49useful tools and practices.</p><h2 id="some-important-overarching-concepts" class="relative group"><span class="heading-text">Some important overarching concepts</span><a class="no-underline text-inherit hover:text-inherit inline-block w-0 px-0 translate-x-[10px] font-normal select-none transition-opacity opacity-0 focus:opacity-100 group-hover:opacity-70" href="#some-important-overarching-concepts" title="Link to this Section" aria-label="Link to this Section">¶</a></h2><ul><li><p>Version control</p></li><li><p>Testing and debugging</p></li><li><p>Continuous integration</p></li><li><p>Packaging and distribution</p></li><li><p>Design principles</p></li><li><p>Compiled code</p></li><li><p>Performance</p></li></ul><p>Over the course, we will go over these concepts. Missing from the above list: 50how to code (you should already know the basics, like loops, functions, and 51such, in at least one language). Also, we wonât cover specific algorithms, which 52is enough for its own course.</p><p>Also, we will be using Python for the first 2/3 of the course, followed by a 53compiled language. The specific language doesnât matter that much, but you have 54to pick one, and Python is an excellent choice. Itâs one of the most widely used 55languages, the one you are statistically the most likely to already be familiar 56with, and one of the best âteachingâ languages (as it was actually developed 57based on a language specifically designed for teaching, the âABCâ language).</p><p>We will be working with a lot of specific tooling, but the concepts are general; 58if you are working in a different language, just find the matching tooling for 59that language. Again, we have to pick something, but once you know the concepts, 60you can find similar tools in almost any language.</p><h2 id="problem-solution-ordering" class="relative group"><span class="heading-text">Problem-solution ordering</span><a class="no-underline text-inherit hover:text-inherit inline-block w-0 px-0 translate-x-[10px] font-normal select-none transition-opacity opacity-0 focus:opacity-100 group-hover:opacity-70" href="#problem-solution-ordering" title="Link to this Section" aria-label="Link to this Section">¶</a></h2><p><a target="_blank" rel="noreferrer" href="https://mkremins.github.io/blog/doors-headaches-intellectual-need/" class="link whitespace-nowrap"><span class="link-text whitespace-normal">Problem-solution ordering</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" class="link-icon"><path stroke-linecap="round" stroke-linejoin="round" d="M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25"></path></svg></a> 61is a problem for many courses, but is especially true for Software Engineering.</p><p>The classic example of problem-solution ordering is in game design. Letâs say 62you design a tutorial level that teaches players about locked doors. You give 63them a key, then they open a door that is unlocked by that key. Assuming players 64now know how to open locked doors, you put a locked door in a real level - and 65players have no idea how to open it; they donât know to go look for a key. Why? 66Because they didnât encounter the locked door before they picked up the key, so 67they donât know that it was the key that made the door open. (The âkeyâ and the 68âdoorâ could be any cause and effect relationship.)</p><p>This occurs in a lot of fields, like math. How do you convince someone who 69hasnât needed math yet that itâs a useful skill to learn?</p><p>This is what we face in Software Engineering. If youâve never had to collaborate 70with others or manage a large software project, you might not see why âgitâ is 71worth learning. If you havenât spent days or weeks trying to track down a 72hard-to-find bug, you might not get why you should spend time learning a
73debugger or unit testing your code. If youâve never had a compiler catch a bug 74that would have been disastrous at runtime, you might not recognize the 75usefulness of static typing. If youâve never had a memory leak or segfault, you 76might not see why itâs worth effort to design with memory safety in mind. And so 77on.</p><p>Weâll try to motivate what we do, but the best motivator is experience and 78exposure to the âsimpleâ way to do things and its shortcomings; then you will 79understand why the more advanced method was created.</p><h3 id="new-features-are-restrictions" class="relative group"><span class="heading-text">New features are restrictions</span><a class="no-underline text-inherit hover:text-inherit inline-block w-0 px-0 translate-x-[10px] font-normal select-none transition-opacity opacity-0 focus:opacity-100 group-hover:opacity-70" href="#new-features-are-restrictions" title="Link to this Section" aria-label="Link to this Section">¶</a></h3><p>Each new concept in programming <em>restricts</em> rather than <em>enables</em>. When we go 80further into topics like functional programming, this will continue to be the 81case. This is odd but true: we could write any program with a very small set of 82constructs; very simple languages are Turing Complete. However, the most 83important feature of programming is <em>organization</em> (also called design).</p><p>Compare this hypothetical pseudo-code:</p><div class="relative myst-code group not-prose my-5 text-sm shadow hover:shadow-md dark:shadow-2xl bg-stone-200/10"><div aria-label="code block content" class="block overflow-auto p-3 myst-code-body hljs"><pre style="background-color:#fff;padding:0;margin:0;background:transparent"><code class="language-text" style="white-space:pre">i = 0 84label start 85compute(i) 86i = i + 1 87if i < 10: goto start</code></pre></div><button title="Copy to Clipboard" class="inline-flex items-center opacity-0 group-hover:opacity-100 hover:opacity-100 focus:opacity-100 active:opacity-100 cursor-pointer ml-2 transition-color duration-200 ease-in-out text-myst-link-underline hover:text-myst-link-hover absolute right-1 myst-code-copy-icon top-1" aria-pressed="false" aria-label="Copy code to clipboard"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" width="24" height="24"><path stroke-linecap="round" stroke-linejoin="round" d="M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 0 1-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 0 1 1.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 0 0-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 0 1-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 0 0-3.375-3.375h-1.5a1.125 1.125 0 0 1-1.125-1.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H9.75"></path></svg></button></div><p>Versus real code:</p><div class="relative myst-code group not-prose my-5 text-sm shadow hover:shadow-md dark:shadow-2xl bg-stone-200/10"><div aria-label="code block content" class="block overflow-auto p-3 myst-code-body hljs"><pre style="background-color:#fff;padding:0;margin:0;background:transparent"><code class="language-python" style="white-space:pre">for i in range(10): 88 compute(i)</code></pre></div><button title="Copy to Clipboard" class="inline-flex items-center opacity-0 group-hover:opacity-100 hover:opacity-100 focus:opacity-100 active:opacity-100 cursor-pointer ml-2 transition-color duration-200 ease-in-out text-myst-link-underline hover:text-myst-link-hover absolute right-1 myst-code-copy-icon top-1" aria-pressed="false" aria-label="Copy code to clipboard"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" width="24" height="24"><path stroke-linecap="round" stroke-linejoin="round" d="M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 0 1-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 0 1 1.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 0 0-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 0 1-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 0 0-3.375-3.375h-1.5a1.125 1.125 0 0 1-1.125-1.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H9.7
885"></path></svg></button></div><p>Now imagine a complex program with thousands of <code>goto</code> statements; you would 89have to work through every line of code to understand it. But if you restrict 90yourself to common structures, like loops, objects, functions, etc., you no 91longer have to look at the whole program, but just smaller, digestible parts.</p><p>Everyone learning a language will know what these common constructs are. No one 92will know what your special constructs are.</p><h4 id="example-match" class="relative group"><span class="heading-text">Example: match</span><a class="no-underline text-inherit hover:text-inherit inline-block w-0 px-0 translate-x-[10px] font-normal select-none transition-opacity opacity-0 focus:opacity-100 group-hover:opacity-70" href="#example-match" title="Link to this Section" aria-label="Link to this Section">¶</a></h4><p>Letâs quickly apply this to a much newer example. Take the following code that 93provides different printouts for different structures:</p><div class="relative myst-code group not-prose my-5 text-sm shadow hover:shadow-md dark:shadow-2xl bg-stone-200/10"><div aria-label="code block content" class="block overflow-auto p-3 myst-code-body hljs"><pre style="background-color:#fff;padding:0;margin:0;background:transparent"><code class="language-python" style="white-space:pre">if isinstance(x, list): 94 print(*x) 95elif isinstance(x, dict): 96 print(*(f"{k}={v}" for k, v in x.items())) 97else: 98 print(x)</code></pre></div><button title="Copy to Clipboard" class="inline-flex items-center opacity-0 group-hover:opacity-100 hover:opacity-100 focus:opacity-100 active:opacity-100 cursor-pointer ml-2 transition-color duration-200 ease-in-out text-myst-link-underline hover:text-myst-link-hover absolute right-1 myst-code-copy-icon top-1" aria-pressed="false" aria-label="Copy code to clipboard"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" width="24" height="24"><path stroke-linecap="round" stroke-linejoin="round" d="M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 0 1-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 0 1 1.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 0 0-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 0 1-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 0 0-3.375-3.375h-1.5a1.125 1.125 0 0 1-1.125-1.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H9.75"></path></svg></button></div><p>versus using pattern matching:</p><div class="relative myst-code group not-prose my-5 text-sm shadow hover:shadow-md dark:shadow-2xl bg-stone-200/10"><div aria-label="code block content" class="block overflow-auto p-3 myst-code-body hljs"><pre style="background-color:#fff;padding:0;margin:0;background:transparent"><code class="language-python" style="white-space:pre">match x: 99 case [*_]: 100 print(*x) 101 case {}: 102 print(*(f"{k}={v}" for k, v in x.items())) 103 case _: 104 print(x)</code></pre></div><button title="Copy to Clipboard" class="inline-flex items-center opacity-0 group-hover:opacity-100 hover:opacity-100 focus:opacity-100 active:opacity-100 cursor-pointer ml-2 transition-color duration-200 ease-in-out text-myst-link-underline hover:text-myst-link-hover absolute right-1 myst-code-copy-icon top-1" aria-pressed="false" aria-label="Copy code to clipboard"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" width="24" height="24"><path stroke-linecap="round" stroke-linejoin="round" d="M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 0 1-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 0 1 1.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 0 0-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 0 1-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 0 0-3.375-3.375h-1.5a1.125 1.125 0 0 1-1.125-1.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H9.7
1045"></path></svg></button></div><p>The pattern matching case is more focused, so it takes less reading. You know 105from the first line <code>match x</code> that this is based on the variable <code>x</code>; in the if 106chain, you could have switched to some other variable partway down the chain, so 107the reader has to look at each branch to verify you are just processing one 108variable. The language has built-in support for various situations, while the 109manual form would require you write everything out. Thereâs a learning curve to 110the more specific structure, but anyone learning the language learns it once, 111rather than rereading it or rewriting it every time in every codebase.</p><h2 id="course-structure" class="relative group"><span class="heading-text">Course structure</span><a class="no-underline text-inherit hover:text-inherit inline-block w-0 px-0 translate-x-[10px] font-normal select-none transition-opacity opacity-0 focus:opacity-100 group-hover:opacity-70" href="#course-structure" title="Link to this Section" aria-label="Link to this Section">¶</a></h2><p>The challenges of this course:</p><ul><li><p>Often introducing solutions before problems</p></li><li><p>Large variance in the audience in terms of skill and background</p></li><li><p>Good coding basics rarely taught elsewhere</p></li></ul><h2 id="introductions" class="relative group"><span class="heading-text">Introductions</span><a class="no-underline text-inherit hover:text-inherit inline-block w-0 px-0 translate-x-[10px] font-normal select-none transition-opacity opacity-0 focus:opacity-100 group-hover:opacity-70" href="#introductions" title="Link to this Section" aria-label="Link to this Section">¶</a></h2><p>Iâd like to know who you are and what you are interested in! Letâs do a round of 112introductions. Suggested topics:</p><ul><li><p>Name</p></li><li><p>Field of study</p></li><li><p>Preferred programming Language(s)</p></li><li><p>A project you are working on or want to work on</p></li></ul><div class="myst-backmatter-parts"></div><div class="myst-footer-links flex pt-10 mb-10 space-x-4"><a class="myst-footer-link flex-1 block p-4 font-normal text-myst-text-secondary no-underline border border-myst-border rounded shadow-sm group hover:border-myst-active hover:text-myst-active hover:shadow-lg myst-footer-link-prev" aria-label="Previous: Software Engineering For Scientific Computing" href="/"><div class="flex h-full align-middle"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" width="1.5rem" height="1.5rem" class="myst-footer-link-icon self-center transition-transform group-hover:-translate-x-1 shrink-0"><path stroke-linecap="round" stroke-linejoin="round" d="M10.5 19.5 3 12m0 0 7.5-7.5M3 12h18"></path></svg><div class="flex-grow text-right"><div class="myst-footer-link-group text-xs text-myst-text-tertiary">Software Engineering For Scientific Computing</div>Software Engineering For Scientific Computing</div></div></a><a class="myst-footer-link flex-1 block p-4 font-normal text-myst-text-secondary no-underline border border-myst-border rounded shadow-sm group hover:border-myst-active hover:text-myst-active hover:shadow-lg myst-footer-link-next" aria-label="Next: Unix setup and tools" href="/setup"><div class="flex h-full align-middle"><div class="flex-grow"><div class="myst-footer-link-group text-xs text-myst-text-tertiary">Week 0: Intro</div>Unix setup and tools</div><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" width="1.5rem" height="1.5rem" class="myst-footer-link-icon self-center transition-transform group-hover:translate-x-1 shrink-0"><path stroke-linecap="round" stroke-linejoin="round" d="M13.5 4.5 21 12m0 0-7.5 7.5M21 12H3"></path></svg></div></a></div></article></main>
112<script>((a,s)=>{if(!window.history.state||!window.history.state.key){let l=Math.random().toString(32).slice(2);window.history.replaceState({key:l},"")}try{let u=JSON.parse(sessionStorage.getItem(a)||"{}")[s||window.history.state.key];typeof u=="number"&&window.scrollTo(0,u)}catch(l){console.error(l),sessionStorage.removeItem(a)}})("positions", null)</script>
112<script>window.__remixContext = {"url":"/intro","state":{"loaderData":{"root":{"config":{"version":3,"myst":"1.10.1","title":"SE4Sci","options":{},"nav":[{"title":"Source","url":"https://github.com/se-for-sci/se-for-sci.github.io"},{"title":"WebAssembly","url":"https://se-for-sci.github.io/live"},{"title":"Binder","url":"https://mybinder.org/v2/gh/se-for-sci/se-for-sci.github.io/main?urlpath=lab"}],"actions":[],"projects":[{"settings":{"output_stderr":"remove-warn","output_matplotlib_strings":"remove"},"title":"Software Engineering For Scientific Computing","authors":[{"nameParsed":{"literal":"Henry Schreiner","given":"Henry","family":"Schreiner"},"name":"Henry Schreiner","id":"contributors-myst-generated-uid-0"},{"nameParsed":{"literal":"Romain Teyssier","given":"Romain","family":"Teyssier"},"name":"Romain Teyssier","id":"contributors-myst-generated-uid-1"}],"github":"https://github.com/se-for-sci/se-for-sci.github.io","copyright":"Copyright 2022","toc":[{"file":"content/intro.md"},{"children":[{"file":"content/week00_intro/intro.md"},{"file":"content/week00_intro/setup.md"},{"file":"content/week00_intro/vcs.md"},{"file":"content/week00_intro/programming_basics.ipynb"},{"file":"content/week00_intro/practices.md"},{"file":"content/week00_intro/cleanup_bessel.ipynb"},{"file":"content/week00_intro/python_setup.md"}],"title":"Week 0: Intro"},{"children":[{"file":"content/week01_git/intro.md"},{"file":"content/week01_git/first_steps.md"},{"file":"content/week01_git/advanced_steps.md"}],"title":"Week 1: Version Control"},{"children":[{"file":"content/week02_agents/setup.md"},{"file":"content/week02_agents/intro.md"},{"file":"content/week02_agents/agents_md.md"},{"file":"content/week02_agents/inspection.md"},{"file":"content/week02_agents/reviewing.md"},{"file":"content/week02_agents/issue_triage.md"},{"file":"content/week02_agents/ci_and_bugfixes.md"},{"file":"content/week02_agents/common_tasks.md"},{"file":"content/week02_agents/repetitive_work.md"},{"file":"content/week02_agents/writing_tests.md"},{"file":"content/week02_agents/profiling.md"},{"file":"content/week02_agents/new_features.md"},{"file":"content/week02_agents/refactors.md"}],"title":"Week 2: Agentic AI"},{"children":[{"file":"content/week03_testing/testing.md"},{"file":"content/week03_testing/pytest.md"},{"file":"content/week03_testing/tdd.md"},{"file":"content/week03_testing/debugging.md"}],"title":"Week 3: Testing"},{"children":[{"file":"content/week04_package/packaging.md"},{"file":"content/week04_package/using_packages.md"},{"file":"content/week04_package/making_a_package.md"},{"file":"content/week04_package/precommit.md"},{"file":"content/week04_package/task_runners.md"}],"title":"Week 4: Packaging and Quality Control"},{"children":[{"file":"content/week05_ci/ci.md"},{"file":"content/week05_ci/cd.md"},{"file":"content/week05_ci/docs.md"}],"title":"Week 5: Continuous Integration"},{"children":[{"file":"content/week06_compiled/Compiled_Languages.ipynb"},{"file":"content/week06_compiled/rust_example/compiled.md"},{"file":"content/week06_compiled/rust_example/rust.md"},{"file":"content/week06_compiled/debugging.md"},{"file":"content/week06_compiled/profiling.md"}],"title":"Week 6: Compiled Languages"},{"children":[{"file":"content/week07_parallel/intro.md"},{"file":"content/week07_parallel/openmp.md"},{"file":"content/week07_parallel/threading.md"},{"file":"content/week07_parallel/concepts.md"},{"file":"content/week07_parallel/mpi.md"}],"title":"Week 7: Parallel Computing"},{"children":[{"file":"content/week08_gpu/gpu.md"}],"title":"WIP: Week 8: GPU Programming"},{"children":[{"file":"content/week09_binding/01-shared-objects/01-shared-objects.ipynb"},{"file":"content/week09_binding/02-cpython/02-cpython.ipynb"},{"file":"content/week09_binding/03-pybind/03a-pybind.ipynb"},{"file":"content/week09_binding/03-pybind/03b-pybind.ipynb"},{"file":"content/week09_binding/06-rust.md"}],"title":"Week 9: Mixing Languages"},{"children":[{"file":"content/week10_oop/introoo.md"},{"file":"content/week10_oop/oodesign.md"}],"title":"Week 10: Object Oriented design"},{"children":[{"file":"content/week11_design/designpatt.md"},{"file":"content/week11_design/functional.md"}],"title":"Week 11: Design Patterns"},{"children":[{"file":"content/week12_typing/typing.md"}],"title":"Week 12: Static Typing"},{"children":[{"file":"content/bonus_misc/webassembly.md"}],"title":"Bonus: Exotic topics"}],"thumbnail":"/build/33087fc734ac83f22a4799d311ccedca.png","exports":[],"bibliography":[],"index":"index","pages":[{"level":1,"title":"Week 0: Intro"},{"slug":"intro","title":"Introductions and motivation","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"setup","title":"Unix setup and tools","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"vcs","title":"Version control overview","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"programming-basics","title":"Programming basics","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"practices","title":"Programming/style general practices","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"cleanup-bessel","title":"Code cleanup example","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"python-setup","title":"Python Setup","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 1: Version Control"},{"slug":"intro-1","title":"Introduction and Motivation","description":"","date":"","thumbnail":"/build/phd101212s-7900496ae2e50d69e93ce2f8126c36a6.png","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"first-steps","title":"First steps with git","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"advanced-steps","title":"More advanced steps with git","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 2: Agentic AI"},{"slug":"setup-1","title":"Setting up Agentic AI","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"intro-2","title":"Intro to Agentic AI","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"agents-md","title":"AGENTS.md","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"inspection","title":"Inspection","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"reviewing","title":"Reviewing","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2}
112,{"slug":"issue-triage","title":"Issue triage","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"ci-and-bugfixes","title":"CI and bugfixes","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"common-tasks","title":"Common tasks","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"repetitive-work","title":"Repetitive work","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"writing-tests","title":"Writing tests","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"profiling","title":"Profiling","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"new-features","title":"New features","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"refactors","title":"Refactors","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 3: Testing"},{"slug":"testing","title":"Intro to testing","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"pytest","title":"Intro to pytest","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"tdd","title":"Test Driven Development (TDD)","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"debugging","title":"Logging \u0026 Debugging","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 4: Packaging and Quality Control"},{"slug":"packaging","title":"Packaging and quality control","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"using-packages","title":"Using packages","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"making-a-package","title":"Making a Package","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"precommit","title":"Pre-commit","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"task-runners","title":"Task runners","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 5: Continuous Integration"},{"slug":"ci","title":"Continuous Integration","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"cd","title":"Continuous Deployment","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"docs","title":"Generating documentation","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 6: Compiled Languages"},{"slug":"compiled-languages","title":"Using Compiled Languages","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"compiled","title":"Intro to compiled languages (Rust)","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"rust","title":"Intro to Rust","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"debugging-1","title":"Debugging","description":"","date":"","thumbnail":"/build/complexLook-978cdd8fb9b3e44b8ad1badf68ece351.jpg","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"profiling-1","title":"Profiling","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 7: Parallel Computing"},{"slug":"intro-3","title":"Introduction to parallel computing","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"openmp","title":"Programming with OpenMP","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"threading","title":"Parallel computing","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2}
112,{"slug":"concepts","title":"Parallel concepts","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"mpi","title":"Programming with MPI","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"WIP: Week 8: GPU Programming"},{"slug":"gpu","title":"GPU programming","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 9: Mixing Languages"},{"slug":"shared-objects","title":"Shared object files","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"cpython","title":"CPython","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"a-pybind","title":"pybind11","description":"","date":"","thumbnail":"/build/pybind11-adf96f08010fabb74ebe87f61af66f90.png","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"b-pybind","title":"Binding detailed example: Minuit2","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"rust-1","title":"Extensions with Rust","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 10: Object Oriented design"},{"slug":"introoo","title":"Intro to Object Oriented Programming (OOP)","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"oodesign","title":"Object Oriented Design","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 11: Design Patterns"},{"slug":"designpatt","title":"Design patterns","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"functional","title":"Functional programming","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 12: Static Typing"},{"slug":"typing","title":"Static Typing","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Bonus: Exotic topics"},{"slug":"webassembly","title":"WebAssembly","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2}]}]},"CONTENT_CDN_PORT":"3100","MODE":"static"},"routes/$":{"config":{"version":3,"myst":"1.10.1","title":"SE4Sci","options":{},"nav":[{"title":"Source","url":"https://github.com/se-for-sci/se-for-sci.github.io"},{"title":"WebAssembly","url":"https://se-for-sci.github.io/live"},{"title":"Binder","url":"https://mybinder.org/v2/gh/se-for-sci/se-for-sci.github.io/main?urlpath=lab"}],"actions":[],"projects":[{"settings":{"output_stderr":"remove-warn","output_matplotlib_strings":"remove"},"title":"Software Engineering For Scientific Computing","authors":[{"nameParsed":{"literal":"Henry Schreiner","given":"Henry","family":"Schreiner"},"name":"Henry Schreiner","id":"contributors-myst-generated-uid-0"},{"nameParsed":{"literal":"Romain Teyssier","given":"Romain","family":"Teyssier"},"name":"Romain Teyssier","id":"contributors-myst-generated-uid-1"}],"github":"https://github.com/se-for-sci/se-for-sci.github.io","copyright":"Copyright 2022","toc":[{"file":"content/intro.md"},{"children":[{"file":"content/week00_intro/intro.md"},{"file":"content/week00_intro/setup.md"},{"file":"content/week00_intro/vcs.md"},{"file":"content/week00_intro/programming_basics.ipynb"},{"file":"content/week00_intro/practices.md"},{"file":"content/week00_intro/cleanup_bessel.ipynb"},{"file":"content/week00_intro/python_setup.md"}],"title":"Week 0: Intro"},{"children":[{"file":"content/week01_git/intro.md"},{"file":"content/week01_git/first_steps.md"},{"file":"content/week01_git/advanced_steps.md"}],"title":"Week 1: Version Control"},{"children":[{"file":"content/week02_agents/setup.md"},{"file":"content/week02_agents/intro.md"},{"file":"content/week02_agents/agents_md.md"},{"file":"content/week02_agents/inspection.md"},{"file":"content/week02_agents/reviewing.md"},{"file":"content/week02_agents/issue_triage.md"},{"file":"content/week02_agents/ci_and_bugfixes.md"},{"file":"content/week02_agents/common_tasks.md"},{"file":"content/week02_agents/repetitive_work.md"},{"file":"content/week02_agents/writing_tests.md"},{"file":"content/week02_agents/profiling.md"},{"file":"content/week02_agents/new_features.md"},{"file":"content/week02_agents/refactors.md"}],"title":"Week 2: Agentic AI"},{"children":[{"file":"content/week03_testing/testing.md"},{"file":"content/week03_testing/pytest.md"},{"file":"content/week03_testing/tdd.md"},{"file":"content/week03_testing/debugging.md"}],"title":"Week 3: Testing"},{"children":[{"file":"content/week04_package/packaging.md"},{"file":"content/week04_package/using_packages.md"},{"file":"content/week04_package/making_a_package.md"},{"file":"content/week04_package/precommit.md"},{"file":"content/week04_package/task_runners.md"}],"title":"Week 4: Packaging and Quality Control"},{"children":[{"file":"content/week05_ci/ci.md"},{"file":"content/week05_ci/cd.md"},{"file":"content/week05_ci/docs.md"}],"title":"Week 5: Continuous Integration"},{"children":[{"file":"content/week06_compiled/Compiled_Languages.ipynb"},{"file":"content/week06_compiled/rust_example/compiled.md"},{"file":"content/week06_compiled/rust_example/rust.md"},{"file":"content/week06_compiled/debugging.md"},{"file":"content/week06_compiled/profiling.md"}],"title":"Week 6: Compiled Languages"},{"children":[{"file":"content/week07_parallel/intro.md"},{"file":"content/week07_parallel/openmp.md"},{"file":"content/week07_parallel/threading.md"},{"file":"content/week07_parallel/concepts.md"},{"file":"content/week07_parallel/mpi.md"}],"title":"Week 7: Parallel Computing"},{"children":[{"file":"content/week08_gpu/gpu.md"}],"title":"WIP: Week 8: GPU Programming"},{"children":[{"file":"content/week09_binding/01-shared-objects/01-shared-objects.ipynb"},{"file":"content/week09_binding/02-cpython/02-cpython.ipynb"},{"file":"content/week09_binding/03-pybind/03a-pybind.ipynb"},{"file":"content/week09_binding/03-pybind/03b-pybind.ipynb"},{"file":"content/week09_binding/06-rust.md"}],"title":"Week 9: Mixing Languages"},{"children":[{"file":"content/week10_oop/introoo.md"},{"file":"content/week10_oop/oodesign.md"}],"title":"Week 10: Object Oriented design"},{"children":[{"file":"content/week11_design/designpatt.md"},{"file":"content/week11_design/functional.md"}],"title":"Week 11: Design Patterns"},{"children":[{"file":"content/week12_typing/typing.md"}],"title":"Week 12: Static Typing"},{"children":[{"file":"content/bonus_misc/webassembly.md"}],"title":"Bonus: Exotic topics"}],"thumbnail":"/build/33087fc734ac83f22a4799d311ccedca.png","exports":[],"bibliography":[],"index":"index","pages":[{"level":1,"title":"Week 0: Intro"},{"slug":"intro","title":"Introductions and motivation","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"setup","title":"Unix setup and tools","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"vcs","title":"Version control overview","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"programming-basics","title":"Programming basics","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"practices","title":"Programming/style general practices","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"cleanup-bessel","title":"Code cleanup example","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"python-setup","title":"Python Setup","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 1: Version Control"},{"slug":"intro-1","title":"Introduction and Motivation","description":"","date":"","thumbnail":"/build/phd101212s-7900496ae2e50d69e93ce2f8126c36a6.png","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"first-steps","title":"First steps with git","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"advanced-steps","title":"More advanced steps with git","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 2: Agentic AI"},{"slug":"setup-1","title":"Setting up Agentic AI","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"intro-2","title":"Intro to Agentic AI","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"agents-md","title":"AGENTS.md","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"inspection","title":"Inspection","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"reviewing","title":"Reviewing","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2}
112,{"slug":"issue-triage","title":"Issue triage","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"ci-and-bugfixes","title":"CI and bugfixes","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"common-tasks","title":"Common tasks","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"repetitive-work","title":"Repetitive work","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"writing-tests","title":"Writing tests","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"profiling","title":"Profiling","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"new-features","title":"New features","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"refactors","title":"Refactors","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 3: Testing"},{"slug":"testing","title":"Intro to testing","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"pytest","title":"Intro to pytest","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"tdd","title":"Test Driven Development (TDD)","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"debugging","title":"Logging \u0026 Debugging","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 4: Packaging and Quality Control"},{"slug":"packaging","title":"Packaging and quality control","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"using-packages","title":"Using packages","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"making-a-package","title":"Making a Package","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"precommit","title":"Pre-commit","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"task-runners","title":"Task runners","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 5: Continuous Integration"},{"slug":"ci","title":"Continuous Integration","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"cd","title":"Continuous Deployment","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"docs","title":"Generating documentation","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 6: Compiled Languages"},{"slug":"compiled-languages","title":"Using Compiled Languages","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"compiled","title":"Intro to compiled languages (Rust)","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"rust","title":"Intro to Rust","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"debugging-1","title":"Debugging","description":"","date":"","thumbnail":"/build/complexLook-978cdd8fb9b3e44b8ad1badf68ece351.jpg","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"profiling-1","title":"Profiling","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 7: Parallel Computing"},{"slug":"intro-3","title":"Introduction to parallel computing","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"openmp","title":"Programming with OpenMP","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"threading","title":"Parallel computing","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2}
112,{"slug":"concepts","title":"Parallel concepts","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"mpi","title":"Programming with MPI","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"WIP: Week 8: GPU Programming"},{"slug":"gpu","title":"GPU programming","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 9: Mixing Languages"},{"slug":"shared-objects","title":"Shared object files","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"cpython","title":"CPython","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"a-pybind","title":"pybind11","description":"","date":"","thumbnail":"/build/pybind11-adf96f08010fabb74ebe87f61af66f90.png","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"b-pybind","title":"Binding detailed example: Minuit2","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"rust-1","title":"Extensions with Rust","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 10: Object Oriented design"},{"slug":"introoo","title":"Intro to Object Oriented Programming (OOP)","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"oodesign","title":"Object Oriented Design","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 11: Design Patterns"},{"slug":"designpatt","title":"Design patterns","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"functional","title":"Functional programming","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 12: Static Typing"},{"slug":"typing","title":"Static Typing","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Bonus: Exotic topics"},{"slug":"webassembly","title":"WebAssembly","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2}]}]},"page":{"version":3,"kind":"Article","sha256":"1c965be819ddaa45ff15bfcda8e00f880ef738f47f96d64fbfcd3b523424e251","slug":"intro","location":"/content/week00_intro/intro.md","dependencies":[],"frontmatter":{"title":"Introductions and motivation","content_includes_title":false,"authors":[{"nameParsed":{"literal":"Henry Schreiner","given":"Henry","family":"Schreiner"},"name":"Henry Schreiner","id":"contributors-myst-generated-uid-0"},{"nameParsed":{"literal":"Romain Teyssier","given":"Romain","family":"Teyssier"},"name":"Romain Teyssier","id":"contributors-myst-generated-uid-1"}],"github":"https://github.com/se-for-sci/se-for-sci.github.io","copyright":"Copyright 2022","settings":{"output_stderr":"remove-warn","output_matplotlib_strings":"remove"},"numbering":{"title":{"offset":1}},"source_url":"https://github.com/se-for-sci/se-for-sci.github.io/blob/main/content/week00_intro/intro.md","edit_url":"https://github.com/se-for-sci/se-for-sci.github.io/edit/main/content/week00_intro/intro.md","exports":[{"format":"md","filename":"intro.md","url":"/build/intro-7de5394b417e964136e5fd6d41277f4f.md"}]},"mdast":{"type":"root","children":[{"type":"block","children":[{"type":"paragraph","position":{"start":{"line":3,"column":1},"end":{"line":3,"column":1}},"children":[{"type":"link","url":"https://se-for-sci.github.io/slides/week-00-1","children":[{"type":"text","value":"Slides","key":"i8E51WApBL"}],"class":"button","urlSource":"https://se-for-sci.github.io/slides/week-00-1","key":"FRSV7Abwb1"}],"key":"CvTHv4GykB"},{"type":"heading","depth":2,"position":{"start":{"line":5,"column":1},"end":{"line":5,"column":1}},"children":[{"type":"text","value":"The importance of software engineering in scientific computing","position":{"start":{"line":5,"column":1},"end":{"line":5,"column":1}}
112,"key":"i6qP0UD6ab"}],"identifier":"the-importance-of-software-engineering-in-scientific-computing","label":"The importance of software engineering in scientific computing","html_id":"the-importance-of-software-engineering-in-scientific-computing","implicit":true,"key":"LgukrOxGy8"},{"type":"paragraph","position":{"start":{"line":7,"column":1},"end":{"line":11,"column":1}},"children":[{"type":"text","value":"Itâs really easy to learn to code. In fact, itâs easier to ","position":{"start":{"line":7,"column":1},"end":{"line":7,"column":1}},"key":"ig7E6a8xZa"},{"type":"emphasis","position":{"start":{"line":7,"column":1},"end":{"line":7,"column":1}},"children":[{"type":"text","value":"write","position":{"start":{"line":7,"column":1},"end":{"line":7,"column":1}},"key":"CSCzsmvbU0"}],"key":"VHkUwTYuqd"},{"type":"text","value":" code than\n","position":{"start":{"line":7,"column":1},"end":{"line":7,"column":1}},"key":"u3qchb4XyL"},{"type":"emphasis","position":{"start":{"line":7,"column":1},"end":{"line":7,"column":1}},"children":[{"type":"text","value":"read","position":{"start":{"line":7,"column":1},"end":{"line":7,"column":1}}
112,"key":"L5jrHRKQ14"}],"key":"YsUyhQJwHY"},{"type":"text","value":" code. Often this leads to the desire to rewrite legacy codebases instead\nof deciphering what the original author intended. Since a main goal of good\nsoftware engineering is to reuse code, this is clearly wasteful! Good code is\neasy to read, always strive for readability.","position":{"start":{"line":7,"column":1},"end":{"line":7,"column":1}},"key":"sg86m0mAbn"}],"key":"tACQd56hwJ"},{"type":"paragraph","position":{"start":{"line":13,"column":1},"end":{"line":19,"column":1}},"children":[{"type":"text","value":"What does someone working on code spend time on? Rewriting code that others have\nalready written. The action of rewriting code to improve its readability or\nperformance without changing how it operates is commonly called refactoring.\nOther reasons to rewrite code are because it didnât scale or was not flexible\nenough. It also can feel like you spend a lot of time debugging. Lots of painful\ndebugging. Having strong unit tests and using version control can simplify or\neliminate some debugging problems.","position":{"start":{"line":13,"column":1},"end":{"line":13,"column":1}}
112,"key":"QryF4kpHok"}],"key":"D0UzYsJ0q0"},{"type":"paragraph","position":{"start":{"line":21,"column":1},"end":{"line":23,"column":1}},"children":[{"type":"text","value":"There are a lot of tools, practices, and techniques available to help you read\nother peopleâs code, write code that others can read (including yourself in six\nmonths), manage scale and flexibility, and make debugging easier.","position":{"start":{"line":21,"column":1},"end":{"line":21,"column":1}},"key":"jy0s8Awdjv"}],"key":"RqHIBYkb5N"},{"type":"paragraph","position":{"start":{"line":25,"column":1},"end":{"line":31,"column":1}},"children":[{"type":"text","value":"But deadlines get in the way. Your PI cares about results, not how maintainable\nyour codebase is. Learning new tools to accelerate your development doesnât fit\ninto tight schedules or isnât seen as necessary at the beginning of a project.\nFrequently, a small script will morph and evolve into a full codebase without\nmuch planning or design. Itâs much easier just to get something working than\nstudy design principles. You pay the price in the end, when trying to publish,\ndistribute, or replicate your results.","position":{"start":{"line":25,"column":1},"end":{"line":25,"column":1}}
112,"key":"I4Pf1Bg0dp"}],"key":"G2KV09paRS"},{"type":"paragraph","position":{"start":{"line":33,"column":1},"end":{"line":34,"column":1}},"children":[{"type":"text","value":"This course aims to fix that by providing a structured introduction to common,\nuseful tools and practices.","position":{"start":{"line":33,"column":1},"end":{"line":33,"column":1}},"key":"JdTliRtmPW"}],"key":"fXe8H6s05b"},{"type":"heading","depth":2,"position":{"start":{"line":36,"column":1},"end":{"line":36,"column":1}},"children":[{"type":"text","value":"Some important overarching concepts","position":{"start":{"line":36,"column":1},"end":{"line":36,"column":1}},"key":"G8aoYJ2WjO"}],"identifier":"some-important-overarching-concepts","label":"Some important overarching concepts","html_id":"some-important-overarching-concepts","implicit":true,"key":"NHfqOGBA5d"},{"type":"list","ordered":false,"spread":false,"position":{"start":{"line":38,"column":1},"end":{"line":45,"column":1}},"children":[{"type":"listItem","spread":true,"position":{"start":{"line":38,"column":1},"end":{"line":38,"column":1}},"children":[{"type":"paragraph","children":[{"type":"text","value":"Version control","position":{"start":{"line":38,"column":1},"end":{"line":38,"column":1}}
112,"key":"i8GJy2z5Qj"}],"key":"aQ2tNbCpXO"}],"key":"WwAdPNX6lr"},{"type":"listItem","spread":true,"position":{"start":{"line":39,"column":1},"end":{"line":39,"column":1}},"children":[{"type":"paragraph","children":[{"type":"text","value":"Testing and debugging","position":{"start":{"line":39,"column":1},"end":{"line":39,"column":1}},"key":"iXRHVsrmak"}],"key":"FapwHNUAUr"}],"key":"FoAnShoX04"},{"type":"listItem","spread":true,"position":{"start":{"line":40,"column":1},"end":{"line":40,"column":1}},"children":[{"type":"paragraph","children":[{"type":"text","value":"Continuous integration","position":{"start":{"line":40,"column":1},"end":{"line":40,"column":1}},"key":"j4WA3EEgrQ"}],"key":"v1ED3i44Fg"}],"key":"Ath8NdXu8k"},{"type":"listItem","spread":true,"position":{"start":{"line":41,"column":1},"end":{"line":41,"column":1}},"children":[{"type":"paragraph","children":[{"type":"text","value":"Packaging and distribution","position":{"start":{"line":41,"column":1},"end":{"line":41,"column":1}},"key":"ALD6BiFq3K"}],"key":"hbDHchzjid"}],"key":"hAZHbHu3rJ"},{"type":"listItem","spread":true,"position":{"start":{"line":42,"column":1},"end":{"line":42,"column":1}},"children":[{"type":"paragraph","children":[{"type":"text","value":"Design principles","position":{"start":{"line":42,"column":1},"end":{"line":42,"column":1}}
112,"key":"bosmMi7GE9"}],"key":"MSccOgmjAt"}],"key":"K35rb7e3en"},{"type":"listItem","spread":true,"position":{"start":{"line":43,"column":1},"end":{"line":43,"column":1}},"children":[{"type":"paragraph","children":[{"type":"text","value":"Compiled code","position":{"start":{"line":43,"column":1},"end":{"line":43,"column":1}},"key":"KHPwbbfm11"}],"key":"lytuaf4ktg"}],"key":"thczba33qk"},{"type":"listItem","spread":true,"position":{"start":{"line":44,"column":1},"end":{"line":45,"column":1}},"children":[{"type":"paragraph","children":[{"type":"text","value":"Performance","position":{"start":{"line":44,"column":1},"end":{"line":44,"column":1}},"key":"J8H1o0Ejmf"}],"key":"AtxiDy7Wvp"}],"key":"kfH1V4cqHj"}],"key":"wu8XsFYME5"},{"type":"paragraph","position":{"start":{"line":46,"column":1},"end":{"line":49,"column":1}},"children":[{"type":"text","value":"Over the course, we will go over these concepts. Missing from the above list:\nhow to code (you should already know the basics, like loops, functions, and\nsuch, in at least one language). Also, we wonât cover specific algorithms, which\nis enough for its own course.","position":{"start":{"line":46,"column":1},"end":{"line":46,"column":1}}
112,"key":"BHyduwOpjI"}],"key":"OXhca7iO7I"},{"type":"paragraph","position":{"start":{"line":51,"column":1},"end":{"line":56,"column":1}},"children":[{"type":"text","value":"Also, we will be using Python for the first 2/3 of the course, followed by a\ncompiled language. The specific language doesnât matter that much, but you have\nto pick one, and Python is an excellent choice. Itâs one of the most widely used\nlanguages, the one you are statistically the most likely to already be familiar\nwith, and one of the best âteachingâ languages (as it was actually developed\nbased on a language specifically designed for teaching, the âABCâ language).","position":{"start":{"line":51,"column":1},"end":{"line":51,"column":1}},"key":"dbhRwH4x6T"}],"key":"xTu2L5UY9j"},{"type":"paragraph","position":{"start":{"line":58,"column":1},"end":{"line":61,"column":1}},"children":[{"type":"text","value":"We will be working with a lot of specific tooling, but the concepts are general;\nif you are working in a different language, just find the matching tooling for\nthat language. Again, we have to pick something, but once you know the concepts,\nyou can find similar tools in almost any language.","position":{"start":{"line":58,"column":1},"end":{"line":58,"column":1}}
112,"key":"B2bOWS43yf"}],"key":"YbMNB96QRk"},{"type":"heading","depth":2,"position":{"start":{"line":63,"column":1},"end":{"line":63,"column":1}},"children":[{"type":"text","value":"Problem-solution ordering","position":{"start":{"line":63,"column":1},"end":{"line":63,"column":1}},"key":"HGkTFr8Bth"}],"identifier":"problem-solution-ordering","label":"Problem-solution ordering","html_id":"problem-solution-ordering","implicit":true,"key":"WGRRlwuezF"},{"type":"paragraph","position":{"start":{"line":65,"column":1},"end":{"line":66,"column":1}},"children":[{"type":"link","url":"https://mkremins.github.io/blog/doors-headaches-intellectual-need/","position":{"start":{"line":65,"column":1},"end":{"line":65,"column":1}},"children":[{"type":"text","value":"Problem-solution ordering","position":{"start":{"line":65,"column":1},"end":{"line":65,"column":1}},"key":"sqP1W0RkNl"}],"urlSource":"https://mkremins.github.io/blog/doors-headaches-intellectual-need/","key":"XHclHHW2mc"},{"type":"text","value":"\nis a problem for many courses, but is especially true for Software Engineering.","position":{"start":{"line":65,"column":1},"end":{"line":65,"column":1}}
112,"key":"hrnk75slZK"}],"key":"npJ6sB5NmJ"},{"type":"paragraph","position":{"start":{"line":68,"column":1},"end":{"line":75,"column":1}},"children":[{"type":"text","value":"The classic example of problem-solution ordering is in game design. Letâs say\nyou design a tutorial level that teaches players about locked doors. You give\nthem a key, then they open a door that is unlocked by that key. Assuming players\nnow know how to open locked doors, you put a locked door in a real level - and\nplayers have no idea how to open it; they donât know to go look for a key. Why?\nBecause they didnât encounter the locked door before they picked up the key, so\nthey donât know that it was the key that made the door open. (The âkeyâ and the\nâdoorâ could be any cause and effect relationship.)","position":{"start":{"line":68,"column":1},"end":{"line":68,"column":1}},"key":"SCyPG47N2r"}],"key":"Vc4OsYUKgq"},{"type":"paragraph","position":{"start":{"line":77,"column":1},"end":{"line":78,"column":1}},"children":[{"type":"text","value":"This occurs in a lot of fields, like math. How do you convince someone who\nhasnât needed math yet that itâs a useful skill to learn?","position":{"start":{"line":77,"column":1},"end":{"line":77,"column":1}}
112,"key":"CtNuSgEhvc"}],"key":"di8geru56l"},{"type":"paragraph","position":{"start":{"line":80,"column":1},"end":{"line":88,"column":1}},"children":[{"type":"text","value":"This is what we face in Software Engineering. If youâve never had to collaborate\nwith others or manage a large software project, you might not see why âgitâ is\nworth learning. If you havenât spent days or weeks trying to track down a\nhard-to-find bug, you might not get why you should spend time learning a\ndebugger or unit testing your code. If youâve never had a compiler catch a bug\nthat would have been disastrous at runtime, you might not recognize the\nusefulness of static typing. If youâve never had a memory leak or segfault, you\nmight not see why itâs worth effort to design with memory safety in mind. And so\non.","position":{"start":{"line":80,"column":1},"end":{"line":80,"column":1}},"key":"iBVSacNWtH"}],"key":"L04BsVGEJB"},{"type":"paragraph","position":{"start":{"line":90,"column":1},"end":{"line":92,"column":1}},"children":[{"type":"text","value":"Weâll try to motivate what we do, but the best motivator is experience and\nexposure to the âsimpleâ way to do things and its shortcomings; then you will\nunderstand why the more advanced method was created.","position":{"start":{"line":90,"column":1},"end":{"line":90,"column":1}}
112,"key":"KJZYES60uS"}],"key":"URGEGdfqUx"},{"type":"heading","depth":3,"position":{"start":{"line":94,"column":1},"end":{"line":94,"column":1}},"children":[{"type":"text","value":"New features are restrictions","position":{"start":{"line":94,"column":1},"end":{"line":94,"column":1}},"key":"A4cazItZAe"}],"identifier":"new-features-are-restrictions","label":"New features are restrictions","html_id":"new-features-are-restrictions","implicit":true,"key":"FaA2kKKUN2"},{"type":"paragraph","position":{"start":{"line":96,"column":1},"end":{"line":100,"column":1}},"children":[{"type":"text","value":"Each new concept in programming ","position":{"start":{"line":96,"column":1},"end":{"line":96,"column":1}},"key":"Mqr1A4omIs"},{"type":"emphasis","position":{"start":{"line":96,"column":1},"end":{"line":96,"column":1}},"children":[{"type":"text","value":"restricts","position":{"start":{"line":96,"column":1},"end":{"line":96,"column":1}},"key":"A87XGMTkkm"}],"key":"LFpuGn8DIP"},{"type":"text","value":" rather than ","position":{"start":{"line":96,"column":1},"end":{"line":96,"column":1}}
112,"key":"w53JH4TjyW"},{"type":"emphasis","position":{"start":{"line":96,"column":1},"end":{"line":96,"column":1}},"children":[{"type":"text","value":"enables","position":{"start":{"line":96,"column":1},"end":{"line":96,"column":1}},"key":"so8YYDWIdo"}],"key":"yZ3XYJldG2"},{"type":"text","value":". When we go\nfurther into topics like functional programming, this will continue to be the\ncase. This is odd but true: we could write any program with a very small set of\nconstructs; very simple languages are Turing Complete. However, the most\nimportant feature of programming is ","position":{"start":{"line":96,"column":1},"end":{"line":96,"column":1}},"key":"DJvadMgIgd"},{"type":"emphasis","position":{"start":{"line":96,"column":1},"end":{"line":96,"column":1}},"children":[{"type":"text","value":"organization","position":{"start":{"line":96,"column":1},"end":{"line":96,"column":1}},"key":"JmM6Xg9DGL"}],"key":"xMuCbaeAKD"},{"type":"text","value":" (also called design).","position":{"start":{"line":96,"column":1},"end":{"line":96,"column":1}}
112,"key":"wkVVnUK1zi"}],"key":"FYY18Qrocn"},{"type":"paragraph","position":{"start":{"line":102,"column":1},"end":{"line":102,"column":1}},"children":[{"type":"text","value":"Compare this hypothetical pseudo-code:","position":{"start":{"line":102,"column":1},"end":{"line":102,"column":1}},"key":"gQC3jPyPhM"}],"key":"DYdMvGBbVg"},{"type":"code","lang":"text","value":"i = 0\nlabel start\ncompute(i)\ni = i + 1\nif i \u003c 10: goto start","position":{"start":{"line":104,"column":1},"end":{"line":110,"column":1}},"key":"S1Ny62hAJ2"},{"type":"paragraph","position":{"start":{"line":112,"column":1},"end":{"line":112,"column":1}},"children":[{"type":"text","value":"Versus real code:","position":{"start":{"line":112,"column":1},"end":{"line":112,"column":1}},"key":"QODmine6So"}],"key":"zvTNKR7wJP"},{"type":"code","lang":"python","value":"for i in range(10):\n compute(i)","position":{"start":{"line":114,"column":1},"end":{"line":117,"column":1}},"key":"zHy958Ia9Y"},{"type":"paragraph","position":{"start":{"line":119,"column":1},"end":{"line":122,"column":1}},"children":[{"type":"text","value":"Now imagine a complex program with thousands of ","position":{"start":{"line":119,"column":1},"end":{"line":119,"column":1}}
112,"key":"UISgVH4Knv"},{"type":"inlineCode","value":"goto","position":{"start":{"line":119,"column":1},"end":{"line":119,"column":1}},"key":"hjvNYEZtmV"},{"type":"text","value":" statements; you would\nhave to work through every line of code to understand it. But if you restrict\nyourself to common structures, like loops, objects, functions, etc., you no\nlonger have to look at the whole program, but just smaller, digestible parts.","position":{"start":{"line":119,"column":1},"end":{"line":119,"column":1}},"key":"wqz6wlVLNC"}],"key":"r3DKtacNlX"},{"type":"paragraph","position":{"start":{"line":124,"column":1},"end":{"line":125,"column":1}},"children":[{"type":"text","value":"Everyone learning a language will know what these common constructs are. No one\nwill know what your special constructs are.","position":{"start":{"line":124,"column":1},"end":{"line":124,"column":1}},"key":"VtZiVJWMnc"}],"key":"b9AXyeZmIi"},{"type":"heading","depth":4,"position":{"start":{"line":127,"column":1},"end":{"line":127,"column":1}},"children":[{"type":"text","value":"Example: match","position":{"start":{"line":127,"column":1},"end":{"line":127,"column":1}}
112,"key":"mseNt01wR7"}],"identifier":"example-match","label":"Example: match","html_id":"example-match","implicit":true,"key":"MShH91RXVn"},{"type":"paragraph","position":{"start":{"line":129,"column":1},"end":{"line":130,"column":1}},"children":[{"type":"text","value":"Letâs quickly apply this to a much newer example. Take the following code that\nprovides different printouts for different structures:","position":{"start":{"line":129,"column":1},"end":{"line":129,"column":1}},"key":"F1dbmzwiD7"}],"key":"Wm1lIihXBk"},{"type":"code","lang":"python","value":"if isinstance(x, list):\n print(*x)\nelif isinstance(x, dict):\n print(*(f\"{k}={v}\" for k, v in x.items()))\nelse:\n print(x)","position":{"start":{"line":132,"column":1},"end":{"line":139,"column":1}},"key":"TA5V1nnPUd"},{"type":"paragraph","position":{"start":{"line":141,"column":1},"end":{"line":141,"column":1}},"children":[{"type":"text","value":"versus using pattern matching:","position":{"start":{"line":141,"column":1},"end":{"line":141,"column":1}}
112,"key":"vI2WZFsTTV"}],"key":"a7pkHaiqtH"},{"type":"code","lang":"python","value":"match x:\n case [*_]:\n print(*x)\n case {}:\n print(*(f\"{k}={v}\" for k, v in x.items()))\n case _:\n print(x)","position":{"start":{"line":143,"column":1},"end":{"line":151,"column":1}},"key":"fGWl2Ig5Jq"},{"type":"paragraph","position":{"start":{"line":153,"column":1},"end":{"line":160,"column":1}},"children":[{"type":"text","value":"The pattern matching case is more focused, so it takes less reading. You know\nfrom the first line ","position":{"start":{"line":153,"column":1},"end":{"line":153,"column":1}},"key":"Art2aSPbAS"},{"type":"inlineCode","value":"match x","position":{"start":{"line":153,"column":1},"end":{"line":153,"column":1}},"key":"gWfiBIrTIP"},{"type":"text","value":" that this is based on the variable ","position":{"start":{"line":153,"column":1},"end":{"line":153,"column":1}},"key":"AsGcL9vCce"},{"type":"inlineCode","value":"x","position":{"start":{"line":153,"column":1},"end":{"line":153,"column":1}}
112,"key":"eilPlRq62H"},{"type":"text","value":"; in the if\nchain, you could have switched to some other variable partway down the chain, so\nthe reader has to look at each branch to verify you are just processing one\nvariable. The language has built-in support for various situations, while the\nmanual form would require you write everything out. Thereâs a learning curve to\nthe more specific structure, but anyone learning the language learns it once,\nrather than rereading it or rewriting it every time in every codebase.","position":{"start":{"line":153,"column":1},"end":{"line":153,"column":1}},"key":"dmB5mzvqqH"}],"key":"S0XjYC4rBo"},{"type":"heading","depth":2,"position":{"start":{"line":162,"column":1},"end":{"line":162,"column":1}},"children":[{"type":"text","value":"Course structure","position":{"start":{"line":162,"column":1},"end":{"line":162,"column":1}},"key":"Y17b3lDzAv"}],"identifier":"course-structure","label":"Course structure","html_id":"course-structure","implicit":true,"key":"WYABnhEI75"},{"type":"paragraph","position":{"start":{"line":164,"column":1},"end":{"line":164,"column":1}},"children":[{"type":"text","value":"The challenges of this course:","position":{"start":{"line":164,"column":1},"end":{"line":164,"column":1}}
112,"key":"u6cqKRfVTg"}],"key":"h1lapwJyrF"},{"type":"list","ordered":false,"spread":false,"position":{"start":{"line":166,"column":1},"end":{"line":169,"column":1}},"children":[{"type":"listItem","spread":true,"position":{"start":{"line":166,"column":1},"end":{"line":166,"column":1}},"children":[{"type":"paragraph","children":[{"type":"text","value":"Often introducing solutions before problems","position":{"start":{"line":166,"column":1},"end":{"line":166,"column":1}},"key":"HuwHKxI5RV"}],"key":"tgsC8XIMA7"}],"key":"wpIaTfc37l"},{"type":"listItem","spread":true,"position":{"start":{"line":167,"column":1},"end":{"line":167,"column":1}},"children":[{"type":"paragraph","children":[{"type":"text","value":"Large variance in the audience in terms of skill and background","position":{"start":{"line":167,"column":1},"end":{"line":167,"column":1}},"key":"TcCmIg9SZ8"}],"key":"EgZyrr0XvC"}],"key":"NnumzgcwB3"},{"type":"listItem","spread":true,"position":{"start":{"line":168,"column":1},"end":{"line":169,"column":1}},"children":[{"type":"paragraph","children":[{"type":"text","value":"Good coding basics rarely taught elsewhere","position":{"start":{"line":168,"column":1},"end":{"line":168,"column":1}}
112,"key":"wz8dUpjXI1"}],"key":"fkkvVVhdc1"}],"key":"hShNUngNdw"}],"key":"dvxqjrngRQ"},{"type":"heading","depth":2,"position":{"start":{"line":170,"column":1},"end":{"line":170,"column":1}},"children":[{"type":"text","value":"Introductions","position":{"start":{"line":170,"column":1},"end":{"line":170,"column":1}},"key":"Eed71hehxf"}],"identifier":"introductions","label":"Introductions","html_id":"introductions","implicit":true,"key":"itSY6xtEpZ"},{"type":"paragraph","position":{"start":{"line":172,"column":1},"end":{"line":173,"column":1}},"children":[{"type":"text","value":"Iâd like to know who you are and what you are interested in! Letâs do a round of\nintroductions. Suggested topics:","position":{"start":{"line":172,"column":1},"end":{"line":172,"column":1}},"key":"Xl7HuKmXpI"}],"key":"YHC0UJaYh7"},{"type":"list","ordered":false,"spread":false,"position":{"start":{"line":175,"column":1},"end":{"line":178,"column":1}},"children":[{"type":"listItem","spread":true,"position":{"start":{"line":175,"column":1},"end":{"line":175,"column":1}},"children":[{"type":"paragraph","children":[{"type":"text","value":"Name","position":{"start":{"line":175,"column":1},"end":{"line":175,"column":1}}
112,"key":"bR8tpmZMO0"}],"key":"tD5LiOfN4o"}],"key":"jOumKCIiST"},{"type":"listItem","spread":true,"position":{"start":{"line":176,"column":1},"end":{"line":176,"column":1}},"children":[{"type":"paragraph","children":[{"type":"text","value":"Field of study","position":{"start":{"line":176,"column":1},"end":{"line":176,"column":1}},"key":"DDasMSVXk6"}],"key":"WJC56irLnO"}],"key":"vflRSDWSji"},{"type":"listItem","spread":true,"position":{"start":{"line":177,"column":1},"end":{"line":177,"column":1}},"children":[{"type":"paragraph","children":[{"type":"text","value":"Preferred programming Language(s)","position":{"start":{"line":177,"column":1},"end":{"line":177,"column":1}},"key":"cc2MnU25OP"}],"key":"x0WPNk1QqX"}],"key":"BT6aBXjxok"},{"type":"listItem","spread":true,"position":{"start":{"line":178,"column":1},"end":{"line":178,"column":1}},"children":[{"type":"paragraph","children":[{"type":"text","value":"A project you are working on or want to work on","position":{"start":{"line":178,"column":1},"end":{"line":178,"column":1}}
112,"key":"dedF97KYIM"}],"key":"mRXLnUQZaS"}],"key":"Krt8vvQnnv"}],"key":"YCRWyydaMb"}],"key":"OIABd1jDWh"}],"key":"bwDHVN9RnH"},"references":{"cite":{"order":[],"data":{}}},"footer":{"navigation":{"prev":{"title":"Software Engineering For Scientific Computing","url":"/","group":"Software Engineering For Scientific Computing"},"next":{"title":"Unix setup and tools","url":"/setup","group":"Week 0: Intro"}}},"domain":"http://localhost:3000"},"project":{"settings":{"output_stderr":"remove-warn","output_matplotlib_strings":"remove"},"title":"Software Engineering For Scientific Computing","authors":[{"nameParsed":{"literal":"Henry Schreiner","given":"Henry","family":"Schreiner"},"name":"Henry Schreiner","id":"contributors-myst-generated-uid-0"},{"nameParsed":{"literal":"Romain Teyssier","given":"Romain","family":"Teyssier"},"name":"Romain Teyssier","id":"contributors-myst-generated-uid-1"}],"github":"https://github.com/se-for-sci/se-for-sci.github.io","copyright":"Copyright 2022","toc":[{"file":"content/intro.md"},{"children":[{"file":"content/week00_intro/intro.md"},{"file":"content/week00_intro/setup.md"},{"file":"content/week00_intro/vcs.md"},{"file":"content/week00_intro/programming_basics.ipynb"},{"file":"content/week00_intro/practices.md"},{"file":"content/week00_intro/cleanup_bessel.ipynb"},{"file":"content/week00_intro/python_setup.md"}],"title":"Week 0: Intro"},{"children":[{"file":"content/week01_git/intro.md"},{"file":"content/week01_git/first_steps.md"},{"file":"content/week01_git/advanced_steps.md"}],"title":"Week 1: Version Control"},{"children":[{"file":"content/week02_agents/setup.md"},{"file":"content/week02_agents/intro.md"},{"file":"content/week02_agents/agents_md.md"},{"file":"content/week02_agents/inspection.md"},{"file":"content/week02_agents/reviewing.md"},{"file":"content/week02_agents/issue_triage.md"},{"file":"content/week02_agents/ci_and_bugfixes.md"},{"file":"content/week02_agents/common_tasks.md"},{"file":"content/week02_agents/repetitive_work.md"},{"file":"content/week02_agents/writing_tests.md"},{"file":"content/week02_agents/profiling.md"},{"file":"content/week02_agents/new_features.md"},{"file":"content/week02_agents/refactors.md"}],"title":"Week 2: Agentic AI"},{"children":[{"file":"content/week03_testing/testing.md"},{"file":"content/week03_testing/pytest.md"},{"file":"content/week03_testing/tdd.md"},{"file":"content/week03_testing/debugging.md"}],"title":"Week 3: Testing"},{"children":[{"file":"content/week04_package/packaging.md"},{"file":"content/week04_package/using_packages.md"},{"file":"content/week04_package/making_a_package.md"},{"file":"content/week04_package/precommit.md"},{"file":"content/week04_package/task_runners.md"}],"title":"Week 4: Packaging and Quality Control"},{"children":[{"file":"content/week05_ci/ci.md"},{"file":"content/week05_ci/cd.md"},{"file":"content/week05_ci/docs.md"}],"title":"Week 5: Continuous Integration"},{"children":[{"file":"content/week06_compiled/Compiled_Languages.ipynb"},{"file":"content/week06_compiled/rust_example/compiled.md"},{"file":"content/week06_compiled/rust_example/rust.md"},{"file":"content/week06_compiled/debugging.md"},{"file":"content/week06_compiled/profiling.md"}],"title":"Week 6: Compiled Languages"},{"children":[{"file":"content/week07_parallel/intro.md"},{"file":"content/week07_parallel/openmp.md"},{"file":"content/week07_parallel/threading.md"},{"file":"content/week07_parallel/concepts.md"},{"file":"content/week07_parallel/mpi.md"}],"title":"Week 7: Parallel Computing"},{"children":[{"file":"content/week08_gpu/gpu.md"}],"title":"WIP: Week 8: GPU Programming"},{"children":[{"file":"content/week09_binding/01-shared-objects/01-shared-objects.ipynb"},{"file":"content/week09_binding/02-cpython/02-cpython.ipynb"},{"file":"content/week09_binding/03-pybind/03a-pybind.ipynb"},{"file":"content/week09_binding/03-pybind/03b-pybind.ipynb"},{"file":"content/week09_binding/06-rust.md"}],"title":"Week 9: Mixing Languages"},{"children":[{"file":"content/week10_oop/introoo.md"},{"file":"content/week10_oop/oodesign.md"}],"title":"Week 10: Object Oriented design"},{"children":[{"file":"content/week11_design/designpatt.md"},{"file":"content/week11_design/functional.md"}],"title":"Week 11: Design Patterns"},{"children":[{"file":"content/week12_typing/typing.md"}],"title":"Week 12: Static Typing"},{"children":[{"file":"content/bonus_misc/webassembly.md"}],"title":"Bonus: Exotic topics"}],"thumbnail":"/build/33087fc734ac83f22a4799d311ccedca.png","exports":[],"bibliography":[],"index":"index","pages":[{"level":1,"title":"Week 0: Intro"},{"slug":"intro","title":"Introductions and motivation","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"setup","title":"Unix setup and tools","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"vcs","title":"Version control overview","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"programming-basics","title":"Programming basics","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"practices","title":"Programming/style general practices","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"cleanup-bessel","title":"Code cleanup example","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"python-setup","title":"Python Setup","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 1: Version Control"},{"slug":"intro-1","title":"Introduction and Motivation","description":"","date":"","thumbnail":"/build/phd101212s-7900496ae2e50d69e93ce2f8126c36a6.png","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"first-steps","title":"First steps with git","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"advanced-steps","title":"More advanced steps with git","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 2: Agentic AI"},{"slug":"setup-1","title":"Setting up Agentic AI","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"intro-2","title":"Intro to Agentic AI","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"agents-md","title":"AGENTS.md","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"inspection","title":"Inspection","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"reviewing","title":"Reviewing","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2}
112,{"slug":"issue-triage","title":"Issue triage","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"ci-and-bugfixes","title":"CI and bugfixes","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"common-tasks","title":"Common tasks","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"repetitive-work","title":"Repetitive work","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"writing-tests","title":"Writing tests","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"profiling","title":"Profiling","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"new-features","title":"New features","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"refactors","title":"Refactors","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 3: Testing"},{"slug":"testing","title":"Intro to testing","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"pytest","title":"Intro to pytest","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"tdd","title":"Test Driven Development (TDD)","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"debugging","title":"Logging \u0026 Debugging","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 4: Packaging and Quality Control"},{"slug":"packaging","title":"Packaging and quality control","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"using-packages","title":"Using packages","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"making-a-package","title":"Making a Package","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"precommit","title":"Pre-commit","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"task-runners","title":"Task runners","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 5: Continuous Integration"},{"slug":"ci","title":"Continuous Integration","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"cd","title":"Continuous Deployment","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"docs","title":"Generating documentation","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 6: Compiled Languages"},{"slug":"compiled-languages","title":"Using Compiled Languages","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"compiled","title":"Intro to compiled languages (Rust)","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"rust","title":"Intro to Rust","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"debugging-1","title":"Debugging","description":"","date":"","thumbnail":"/build/complexLook-978cdd8fb9b3e44b8ad1badf68ece351.jpg","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"profiling-1","title":"Profiling","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 7: Parallel Computing"},{"slug":"intro-3","title":"Introduction to parallel computing","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"openmp","title":"Programming with OpenMP","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"threading","title":"Parallel computing","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2}
112,{"slug":"concepts","title":"Parallel concepts","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"mpi","title":"Programming with MPI","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"WIP: Week 8: GPU Programming"},{"slug":"gpu","title":"GPU programming","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 9: Mixing Languages"},{"slug":"shared-objects","title":"Shared object files","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"cpython","title":"CPython","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"a-pybind","title":"pybind11","description":"","date":"","thumbnail":"/build/pybind11-adf96f08010fabb74ebe87f61af66f90.png","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"b-pybind","title":"Binding detailed example: Minuit2","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"rust-1","title":"Extensions with Rust","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 10: Object Oriented design"},{"slug":"introoo","title":"Intro to Object Oriented Programming (OOP)","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"oodesign","title":"Object Oriented Design","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 11: Design Patterns"},{"slug":"designpatt","title":"Design patterns","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"functional","title":"Functional programming","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Week 12: Static Typing"},{"slug":"typing","title":"Static Typing","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Bonus: Exotic topics"},{"slug":"webassembly","title":"WebAssembly","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2}]}}},"actionData":null,"errors":null},"future":{"unstable_dev":false,"unstable_postcss":false,"unstable_tailwind":false,"v2_errorBoundary":true,"v2_headers":true,"v2_meta":true,"v2_normalizeFormMethod":true,"v2_routeConvention":true}};</script>
112<script type="module" async="">import "/build/manifest-0F78CC2B.js"; 113import * as route0 from "/build/root-C5CK33H3.js"; 114import * as route1 from "/build/routes/$-6ALOT4PW.js"; 115window.__remixRouteModules = {"root":route0,"routes/$":route1}; 116 117import("/build/entry.client-NNNALS5X.js");</script>
117</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.