During the first two days of this interactive course, we will go over some important algorithms and data structures topics. We will also review both hardware and software technologies from an industrial perspective and provide a deep dive into cutting-edge advances in both areas that are not usually covered in academic environments.
The third and final day will emphasize advanced techniques in writing rock-solid, optimized, and maintainable software. We will cover the intricacies of how to write highly-performant C/C++ code, according to industry standards, which is critical for delivering successful products. Many students believe that this is easy, but years of industry experience can demonstrate that it is not. Developing systems to be performant requires deep understanding and expertise in both software and hardware architectures. Last, but not least, we will discuss job interview preparation, workplace expectations, and best practices for a successful career. We will also cover other important topics (micro-inequities, communication, etc.) that are rarely discussed outside of a forum like this one.
This four-day event is an excellent opportunity for students to deepen their skillsets, prepare for future careers, and set themselves apart from the competition.
Justin Gottschlich, Ph.D., is a senior staff research scientist at Intel Labs, where he leads the artificial intelligence team in the programming systems research group. He is the Intel principal investigator and co-founder of the joint Intel-NSF CAPA research center for programmability of heterogeneous systems. His current research interests focus on machine learning with an emphasis on software generation, anomaly detection, and autonomous systems. Justin currently oversees academic collaborations at Brown and Stanford Universities and an industrial collaboration between Intel and BMW for anomaly detection on autonomous vehicles.
Justin is a founding member of the Machine Learning and Programming Languages (MAPL) workshop. He has been the general and program chairs for MAPL and TRANSACT and the vice-chair of the C++ Standards Transactional Memory Working Group (SG5). Justin has over two dozen publications and holds 15 patents with over forty pending. He completed his PhD at the University of Colorado – Boulder on optimizations for parallel computing systems. He is also the CEO of Nodeka, LLC., where he has written around 500k lines of low-level C++ code for his an online gaming company that he has run for 20 years.
Embedded Systems | Software & Hardware Efficiency | Parallel Computing | Applied Machine Learning | Anomaly Detection | Optimized Systems Programming in C/C++ | Software Programmability / Productivity
Attendees are expected to have the following:
- Experience with C/C++
- Laptop computer (please remember to bring laptop charger)
- C++ development environment (e.g., editor, compiler, linker)
30 August (Thursday): 1 pm – 9 pm
- Basics: transistors (Dennard scaling, Moore’s law), functional units, registers, caches, memories, processors
- Types: high-performance computing, data centers (cloud), high-power and low-power edge devices
- Heterogeneity: CPU, GPU, FPGA, ASIC
- Execution models: in-order, out-of-order, VLIW, vectorization, speculation
- Parallelism: Flynn’s taxonomy, Amdahl’s law, data and task parallelism, cache coherence, processes, threads
31 August (Friday): 1 pm – 9 pm
- Basics: specifications, implementations, maintenance
- Programming languages: domain specific languages, system languages, application languages, scripting/interpreted languages, data-centric languages, procedural programming, object-oriented programming, functional programming, logic programming
- Types and type systems: sign/unsigned, booleans, integers, floating point, strings, typed, untyped, dynamic, static
- Containers and algorithms: vector/array, lists, hashmaps, sets, trees, bloom filters, searching, sorting, inserting, deleting, parallelization
- Complexity: spatial and temporal, theory versus practice
- Testing: unit tests, regression tests, integration tests, continuous tests
- Types of software: operating systems (+hypervisors), virtualization, containers, applications
- Challenges: (hard and soft) real-time systems, embedded systems, low-power compute, distributed workloads
1 September (Saturday): 11 am – 9 pm
Focus: Algorithms and Data Structures
- Implementation and use of various data structures
- Data structure trade-offs: theory vs practice
- Optimality for basic operations: insert, lookup, delete
- How to pick the right data structures?
- Big O and its relevance
- Reducing Big O spatial and temporal complexity for algorithms and data structures
- How to build the right algorithm for the problem?
- Academic solutions vs. practical solutions (e.g, recursion vs. iterative, etc.)
- P, NP, NP-complete, NP-hard
2 September (Sunday): 11 am – 9 pm
Focus: Advanced Software Techniques (First Session)
- Programmers vs. Ninjas
- Non-obfuscating optimizations: laziness, short-circuits, variables, control flow
- Advanced C++: template programming, generic programming, type-safety
- Writing elegant code: naming, scoping, one function / one operation
- Temporaries, constructors (allocators), destructors (deallocators)
- Error-handling: exception handling, global errors, multi-threaded complexity
- Writing world-class software; guarding against performance and correctness bugs
Focus: Technological Careers (Second Session)
- Interviewing: preparing, techniques, managing offers, understanding your worth (i.e., supply vs. demand)
- Practice interview problems
- Soft skills and micro-inequities
- Life after academia: life-long learning and understanding emerging areas
- Ego: knowing the difference between facts and opinions
- Professionalism: writing, speaking, visualization
- Attributes of great technologists: hard working, curious, technically competent, communicative, introspective, ever-growing