9595 < main >
9696 < h1 > < span style ="color: var(--color-dark-gray) "> isLoop 2026</ span > Program</ h1 >
9797
98- < p > Program will be published soon</ p >
98+ < p >
99+ isLoop has two parallel tracks. Use the buttons below to view the program for each track.
100+ </ p >
101+
102+ < div class ="track-switch " role ="tablist " aria-label ="Program tracks ">
103+ < button
104+ type ="button "
105+ class ="track-button active "
106+ data-track ="a "
107+ role ="tab "
108+ aria-selected ="true "
109+ aria-controls ="track-a "
110+ id ="track-a-tab "
111+ >
112+ Track A: Beginners
113+ </ button >
114+
115+ < button
116+ type ="button "
117+ class ="track-button "
118+ data-track ="b "
119+ role ="tab "
120+ aria-selected ="false "
121+ aria-controls ="track-b "
122+ id ="track-b-tab "
123+ >
124+ Track B: Advanced and collaborative
125+ </ button >
126+ </ div >
127+
128+ < section id ="track-a " class ="track-content active " role ="tabpanel " aria-labelledby ="track-a-tab ">
129+ < h2 > Track A: Beginners</ h2 >
130+
131+ < p >
132+ This track is for absolute beginners in Pharo (and beginners in OO who want a solid foundation).
133+ It is structured like the Pharo MOOC: short explanations followed by lots of guided practice.
134+ </ p >
135+
136+ < h3 > Guided exercises</ h3 >
137+ < p >
138+ We will provide exercise PDFs and repositories. The list below reflects the typical path (final links will be published soon).
139+ </ p >
140+
141+ < ul >
142+ < li > < b > Counter</ b > : packages, classes, tests, debugger workflow</ li >
143+ < li > < b > Dice / small embedded DSL</ b > : messages as a domain language</ li >
144+ < li > < b > Rock-Paper-Scissors</ b > : move from if/else to message sending (double dispatch)</ li >
145+ < li > < b > Mini project</ b > : a small interactive app or simulation (in pairs or small groups)</ li >
146+ </ ul >
147+
148+ < h3 > Day 1: Introduction to Pharo and live programming</ h3 >
149+ < ul >
150+ < li > Welcome and installation check (Pharo Launcher, image, tools)</ li >
151+ < li > First look at Playground, Inspector, System Browser, Debugger</ li >
152+ < li > Objects and messages: explore by inspecting and changing code while it runs</ li >
153+ < li > Start the Counter exercise (tests + debugging)</ li >
154+ </ ul >
155+
156+ < h3 > Day 2: Object modeling, collections, and dispatch thinking</ h3 >
157+ < ul >
158+ < li > Collections and blocks: the everyday toolbox</ li >
159+ < li > Finish / extend the Counter exercise</ li >
160+ < li > Rock-Paper-Scissors kata: refactor from conditionals to message sending</ li >
161+ < li > Start the mini project</ li >
162+ </ ul >
163+
164+ < h3 > Day 3: Design basics and finishing a complete small project</ h3 >
165+ < ul >
166+ < li > Refactoring clinic: smaller methods, clearer responsibilities</ li >
167+ < li > Testing and debugging habits: repeatable workflow</ li >
168+ < li > Finish the mini project with mentor feedback</ li >
169+ < li > Prepare a short demo for the daily demo session</ li >
170+ </ ul >
171+
172+ < h3 > Recommended resources</ h3 >
173+ < ul >
174+ < li > < a href ="https://mooc.pharo.org/ " target ="_blank " rel ="noopener noreferrer "> Pharo MOOC</ a > </ li >
175+ < li > < a href ="https://pharo.org/documentation " target ="_blank " rel ="noopener noreferrer "> Pharo documentation</ a > </ li >
176+ < li > < a href ="https://pharo.org/download " target ="_blank " rel ="noopener noreferrer "> Download Pharo</ a > </ li >
177+ </ ul >
178+ </ section >
179+
180+ < section id ="track-b " class ="track-content " role ="tabpanel " aria-labelledby ="track-b-tab ">
181+ < h2 > Track B: Advanced and collaborative</ h2 >
182+
183+ < p >
184+ This track is for experienced programmers who want to deepen their Pharo practice and learn from each other.
185+ It is less lecture-driven and more sprint-oriented: peer sessions, katas, code reviews, and open source contributions.
186+ </ p >
187+
188+ < h3 > Core activities</ h3 >
189+ < ul >
190+ < li > < b > Micro-talks</ b > : short experience sharing (tools, idioms, workflows)</ li >
191+ < li > < b > Coding katas</ b > : TDD and refactoring in pairs, rotating partners</ li >
192+ < li > < b > Open source sprint</ b > : pick issues, pair, submit PRs, review</ li >
193+ < li > < b > Deep dives</ b > : Inspector/Debugger workflows, profiling, reflection</ li >
194+ </ ul >
195+
196+ < h3 > Day 1: Align on practices and pick sprint targets</ h3 >
197+ < ul >
198+ < li > Lightning round: participant micro-talks</ li >
199+ < li > Tool-focused peer session (debugger workflows, inspectors, profiling)</ li >
200+ < li > Sprint setup: choose repositories, issues, and small teams</ li >
201+ < li > Warm-up kata + shared code review checklist</ li >
202+ </ ul >
203+
204+ < h3 > Day 2: Open source sprint</ h3 >
205+ < ul >
206+ < li > Pair programming on real issues (bugfixes, features, docs)</ li >
207+ < li > PRs and reviews across teams</ li >
208+ < li > Short checkpoints to unblock and rescope</ li >
209+ </ ul >
210+
211+ < h3 > Day 3: Kata, architecture jam, and wrapping contributions</ h3 >
212+ < ul >
213+ < li > Kata rotations: TDD and refactoring under time pressure</ li >
214+ < li > Architecture jam: small design challenge and discussion of tradeoffs</ li >
215+ < li > Wrap up PRs, documentation, and next steps</ li >
216+ < li > Prepare a short demo for the daily demo session</ li >
217+ </ ul >
218+
219+ < h3 > Recommended resources</ h3 >
220+ < ul >
221+ < li > < a href ="https://advanced-design-mooc.pharo.org/ " target ="_blank " rel ="noopener noreferrer "> Advanced Design MOOC</ a > </ li >
222+ < li > < a href ="https://pharo.org/contribute " target ="_blank " rel ="noopener noreferrer "> How to contribute to Pharo</ a > </ li >
223+ < li > < a href ="https://pharo.org/documentation " target ="_blank " rel ="noopener noreferrer "> Pharo documentation</ a > </ li >
224+ </ ul >
225+ </ section >
99226
100227 </ main >
101228
@@ -149,5 +276,39 @@ <h1><span style="color: var(--color-dark-gray)">isLoop 2026</span> Program</h1>
149276 </ footer >
150277
151278 < script src ="./script.js "> </ script >
279+
280+ < script >
281+ ( function ( ) {
282+ const buttons = document . querySelectorAll ( ".track-button" ) ;
283+ const panels = document . querySelectorAll ( ".track-content" ) ;
284+
285+ function activate ( track ) {
286+ buttons . forEach ( ( b ) => {
287+ const isActive = b . getAttribute ( "data-track" ) === track ;
288+ b . classList . toggle ( "active" , isActive ) ;
289+ b . setAttribute ( "aria-selected" , isActive ? "true" : "false" ) ;
290+ } ) ;
291+
292+ panels . forEach ( ( p ) => {
293+ p . classList . toggle ( "active" , p . id === ( track === "b" ? "track-b" : "track-a" ) ) ;
294+ } ) ;
295+
296+ // Optional: reflect selection in URL for sharing
297+ history . replaceState ( null , "" , track === "b" ? "#track-b" : "#track-a" ) ;
298+ }
299+
300+ function initialTrack ( ) {
301+ const h = ( location . hash || "" ) . toLowerCase ( ) ;
302+ if ( h === "#track-b" ) return "b" ;
303+ return "a" ;
304+ }
305+
306+ buttons . forEach ( ( b ) => {
307+ b . addEventListener ( "click" , ( ) => activate ( b . getAttribute ( "data-track" ) ) ) ;
308+ } ) ;
309+
310+ activate ( initialTrack ( ) ) ;
311+ } ) ( ) ;
312+ </ script >
152313 </ body >
153314</ html >
0 commit comments