-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
546 lines (521 loc) · 35.9 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Personal website of Thomas Canning, a Computer Science student with a focus on Quantitative Trading.">
<meta name="format-detection" content="telephone=no">
<title>Thomas Canning</title>
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.css">
</head>
<body>
<header>
<div class="header-content">
<div class="intro-text">
<h1>Thomas Canning</h1>
<p>Computer Science BSc Student, Software Engineer, and Aspiring Quantitative Trader</p>
<div class="social-links">
<a href="https://github.com/ThomasCanning/" target="_blank" aria-label="GitHub">
<i class="fab fa-github"></i> <div class="a-text">GitHub</div>
</a>
<span class="pipe">|</span>
<a href="https://www.linkedin.com/in/thomasjakecanning/" target="_blank" aria-label="LinkedIn">
<i class="fab fa-linkedin"></i> <div class="a-text">LinkedIn</div>
</a>
</div>
</div>
<div class="profile-image">
<img src="img/personal_portrait.png" alt="Your Photo">
</div>
</div>
</header>
<section id="about" class="top">
<div class="content">
<h2>About Me</h2>
<p>
Driven by a passion for technology, mathematics, machine learning, and finance, I am a Computer Science student studying at the University of Bath with a strong interest in pursuing a career in quantitative finance.
Currently honing my programming and problem-solving skills as a Software Engineer at Confluent during my year in industry, I am eager to apply my skills and gain further experience in quantitative finance through an internship in the summer of 2025.</p>
<div class="wave">
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none">
<path d="M321.39,56.44c58-10.79,114.16-30.13,172-41.86,82.39-16.72,168.19-17.73,250.45-.39C823.78,31,906.67,72,985.66,92.83c70.05,18.48,146.53,26.09,214.34,3V0H0V27.35A600.21,600.21,0,0,0,321.39,56.44Z" class="shape-fill"></path>
</svg>
</div>
</div>
</section>
<section id="projects" class="section-dark">
<div class="content">
<h2>Personal Projects</h2>
<div class="project-widget-top">
</div>
<div class="project-widget-bottom">
<div class="project" onclick="toggleProjectDescription(this)">
<div class="skill-icon">
<img src="/img/calkeeper/icon.png" alt="Project Icon">
<div class="github-link">
<a href="https://github.com/Sparky-Software/CalKeeper" target="_blank">
<i class="fab fa-github"></i>GitHub
</a>
</div>
</div>
<div class="skill-info">
<div class="project-title">CalKeeper</div>
<div class="project-subtitle">Electrical Test Instrument Logbook App.</div>
<div class="project-sub-subtitle">
<em>Mobile app built in Flutter, published to the Google Play Store.<br></em>
</div>
<div class="project-description">
<div class="github-link">
<a href="https://github.com/Sparky-Software/CalKeeper" target="_blank">
<i class="fab fa-github"></i>GitHub
</a>
</div>
CalKeeper is the comprehensive solution for helping UK electricians maintain accurate and up-to-date records of their electrical test instruments. Electrical test instruments must be calibrated every 3 years, and up-to-date records must be kept each month to ensure the instrument remains within calibration tolerance. With CalKeeper, electricians can:
<ul>
<li>Record instrument insulation, continuity, earth loop, and RCD values, with the flexibility to enter as much or as little detail as needed.</li>
<li>Export reports for each instrument to PDF at the tap of a button.</li>
<li>Receive automatic alerts if values deviate from baseline readings.</li>
<li>Stay on top of testing with notifications for upcoming instrument tests.</li>
<li>Get started easily with tutorial prompts guiding setup.</li>
</ul>
The app is built in Flutter, with data stored on the device using Hive. This is my first mobile app released to an app store, and it has taught me a great deal about mobile app design and the process of public release. The app is currently under review on the Google Play Store, and will be released on IOS in early 2025.
<br><h5>Screenshots:</h5>
<div class="screenshots-gallery" id="calkeeper">
<a href="/img/calkeeper/s1.png" data-fancybox="gallery" data-caption="Screenshot 1 - Home Screen">
<img src="/img/calkeeper/s1.png" alt="Screenshot 1 - Home Screen">
</a>
<a href="/img/calkeeper/s2.png" data-fancybox="gallery" data-caption="Screenshot 2 - PDF export">
<img src="/img/calkeeper/s2.png" alt="Screenshot 2 - PDF export">
</a>
<a href="/img/calkeeper/s3.png" data-fancybox="gallery" data-caption="Screenshot 3 - Test overview">
<img src="/img/calkeeper/s3.png" alt="Screenshot 3 - Test overview">
</a>
<a href="/img/calkeeper/s4.png" data-fancybox="gallery" data-caption="Screenshot 4 - Settings">
<img src="/img/calkeeper/s4.png" alt="Screenshot 4 - Settings">
</a>
<a href="/img/calkeeper/s5.png" data-fancybox="gallery" data-caption="Screenshot 5 - Tutorial">
<img src="/img/calkeeper/s5.png" alt="Screenshot 5 - Tutorial">
</a>
<a href="/img/calkeeper/s6.png" data-fancybox="gallery" data-caption="Screenshot 6 - Record values">
<img src="/img/calkeeper/s6.png" alt="Screenshot 6 - Record values">
</a>
<a href="/img/calkeeper/s7.png" data-fancybox="gallery" data-caption="Screenshot 7 - Instrument details">
<img src="/img/calkeeper/s7.png" alt="Screenshot 7 - Instrument details">
</a>
<a href="/img/calkeeper/s8.png" data-fancybox="gallery" data-caption="Screenshot 8 - Instrument tests">
<img src="/img/calkeeper/s8.png" alt="Instrument tests - Settings">
</a>
</div>
</div>
</div>
</div>
<div class="project" onclick="toggleProjectDescription(this)">
<div class="skill-icon">
<img src="/img/options_pricer/icon.jpg" alt="Project Icon">
<div class="github-link">
<a href="https://github.com/ThomasCanning/OptionsPricing" target="_blank">
<i class="fab fa-github"></i>GitHub
</a>
</div>
</div>
<div class="skill-info">
<div class="project-title">Options Pricer</div>
<div class="project-subtitle">Options pricing calculator and price visualisation tool.</div>
<div class="project-sub-subtitle">
<em>Desktop app built in Python.</em>
</div>
<div class="project-description">
<div class="github-link">
<a href="https://github.com/ThomasCanning/OptionsPricing" target="_blank">
<i class="fab fa-github"></i>GitHub
</a>
</div>
This tool calculates the price of European call and put options, using either the Black-Scholes formula or the binomial pricing model. The models are based on the book "Options, Futures, and Other Derivatives" by John C. Hull (5th edition). Additionally, you can plot each variable against the options call or put price to visualize the impact of each variable on the option price.
The app is built in Python, with a Tkinter GUI. The binomial pricing model uses numpy for calculations, and the graphs are plotted with matplotlib. The project was a great way of improving my understanding of option pricing models, and the mathematics behind them.
<br><h5>Screenshots:</h5>
<div class="screenshots-gallery" id="options">
<a href="/img/options_pricer/s1.png" data-fancybox="gallery" data-caption="Screenshot 1 - Call price">
<img src="/img/options_pricer/s1.png" alt="Screenshot 1 - Call price">
</a>
<a href="/img/options_pricer/s2.png" data-fancybox="gallery" data-caption="Screenshot 2 - Put price">
<img src="/img/options_pricer/s2.png" alt="Screenshot 2 - Put price">
</a>
</div>
</div>
</div>
</div>
<div class="project" onclick="toggleProjectDescription(this)">
<div class="skill-icon">
<img src="/img/amaze/icon.jpg" alt="Project Icon">
<div class="github-link">
<a href="https://github.com/ThomasCanning/Amaze" target="_blank">
<i class="fab fa-github"></i>GitHub
</a>
</div>
</div>
<div class="skill-info">
<div class="project-title">Amaze</div>
<div class="project-subtitle">Visualisation tool for graph search algorithms.</div>
<div class="project-sub-subtitle">Desktop app built in Java.</div>
<div class="project-description">
<div class="github-link">
<a href="https://github.com/ThomasCanning/Amaze" target="_blank">
<i class="fab fa-github"></i>GitHub
</a>
</div>
Amaze is a visualisation tool for graph search algorithms. You are given a 25 by 25 grid and can create a maze of wall pieces with a start and end tile. You are then able to select a pathfinding algorithm (A*, depth first search, breadth first search, or random search) and display the path it finds. You can also choose to display all the nodes that the algorithm visits in the process of finding the path. This allows you to compare the path found by different algorithms, as well as see a rough time comparison for the time it takes to run. You can also save your created maze so it will be there next time the programme runs. This was a very useful project for understanding how graph search algorithms work.
<br><h5>Screenshots:</h5>
<div class="screenshots-gallery" id="amaze">
<a href="/img/amaze/s1.png" data-fancybox="gallery" data-caption="Screenshot 1 - A* search">
<img src="/img/amaze/s1.png" alt="Screenshot 1 - Call price">
</a>
<a href="/img/amaze/s2.png" data-fancybox="gallery" data-caption="Screenshot 2 - Depth-first search">
<img src="/img/amaze/s2.png" alt="Screenshot 2 - Put price">
</a>
<a href="/img/amaze/s3.png" data-fancybox="gallery" data-caption="Screenshot 3 - Breadth-first search">
<img src="/img/amaze/s3.png" alt="Screenshot 3 - Call price">
</a>
<a href="/img/amaze/s4.png" data-fancybox="gallery" data-caption="Screenshot 4 - Random search">
<img src="/img/amaze/s4.png" alt="Screenshot 4 - Put price">
</a>
<a href="/img/amaze/s5.png" data-fancybox="gallery" data-caption="Screenshot 5 - A* showing all nodes searched">
<img src="/img/amaze/s5.png" alt="Screenshot 5 - Call price">
</a>
<a href="/img/amaze/s6.png" data-fancybox="gallery" data-caption="Screenshot 2 - Depth first showing all nodes searched">
<img src="/img/amaze/s6.png" alt="Screenshot 6 - Put price">
</a>
</div>
</div>
</div>
</div>
<div class="project" onclick="toggleProjectDescription(this)">
<div class="skill-icon">
<img src="/img/hangman/icon.jpg" alt="Project Icon">
<div class="github-link">
<a href="https://github.com/ThomasCanning/Hangman" target="_blank">
<i class="fab fa-github"></i>GitHub
</a>
</div>
</div>
<div class="skill-info">
<div class="project-title">Hangman</div>
<div class="project-subtitle">A single and multiplayer graphical hangman game.</div>
<div class="project-sub-subtitle">Desktop app built in Java.</div>
<div class="project-description">
<div class="github-link">
<a href="https://github.com/ThomasCanning/Hangman" target="_blank">
<i class="fab fa-github"></i>GitHub
</a>
</div>
This is a classical hangman game - guess the word without too many incorrect guesses or the man gets hung. In single-player, the word is a country, selected randomly from a text file, the player has 6 guesses to guess the word, with each incorrect guess bringing the man 1 step closer to being hung. Try to beat your highscore, which the game keeps track of by writing to a local file. There is also multiplayer mode, where players alternate between picking and guessing a word. I learnt lots about Java and developing a GUI in this project.
<br><h5>Screenshots:</h5>
<div class="screenshots-gallery" id="hangman">
<a href="/img/hangman/s1.png" data-fancybox="gallery" data-caption="Screenshot 1 - Main game screen">
<img src="/img/hangman/s1.png" alt="Screenshot 1 - Main game screen">
</a>
<a href="/img/hangman/s2.png" data-fancybox="gallery" data-caption="Screenshot 2 - End of game screen">
<img src="/img/hangman/s2.png" alt="Screenshot 2 - End of game screen">
</a>
<a href="/img/hangman/s3.png" data-fancybox="gallery" data-caption="Screenshot 3 - End of round screen">
<img src="/img/hangman/s1.png" alt="Screenshot 1 - End of round screen">
</a>
<a href="/img/hangman/s4.png" data-fancybox="gallery" data-caption="Screenshot 4 - Multiplayer mode">
<img src="/img/hangman/s2.png" alt="Screenshot 2 - Multiplayer mode">
</a>
</div>
</div>
</div>
</div>
<div class="project" onclick="toggleProjectDescription(this)">
<div class="skill-icon">
<img src="/img/racket_ready/icon.jpg" alt="Project Icon">
<div class="github-link">
<a href="https://github.com/ESP-Number-One/RacketReady" target="_blank">
<i class="fab fa-github"></i>GitHub
</a>
</div>
</div>
<div class="skill-info">
<div class="project-title">Racket Ready</div>
<div class="project-subtitle">Racket-sports matchmaking app.</div>
<div class="project-sub-subtitle">
<em>Progressive web-app for mobile built in Typescript and React.</em>
</div>
<div class="project-description">
<div class="github-link">
<a href="https://github.com/ESP-Number-One/RacketReady" target="_blank">
<i class="fab fa-github"></i>GitHub
</a>
</div>
I contributed to the development of Racket Ready as part oaf the Experimental Systems Project module during my second year at university. This year-long software engineering module involved developing a solution to a problem in the hobbies domain as part of a team of eight. Racket Ready helps players find the ideal racket-sports partner by matching them based on skill level and availability. It also features a league system which challenges players to climb the ranks. I worked on the frontend of the app, developing components in React and Typescript. This project provided valuable experience in developing software in a team, and deepened my understanding of the software engineering lifecycle.
<br><h5>Screenshots:</h5>
<div class="screenshots-gallery" id="racket_ready">
<a href="/img/racket_ready/s1.png" data-fancybox="gallery" data-caption="Screenshot 1 - Call price">
<img src="/img/racket_ready/s1.png" alt="Screenshot 1 - Player profile">
</a>
<a href="/img/racket_ready/s2.png" data-fancybox="gallery" data-caption="Screenshot 2 - Put price">
<img src="/img/racket_ready/s2.png" alt="Screenshot 2 - Proposed matches">
</a>
<a href="/img/racket_ready/s3.png" data-fancybox="gallery" data-caption="Screenshot 3 - Call price">
<img src="/img/racket_ready/s3.png" alt="Screenshot 3 - Upcoming matches">
</a>
<a href="/img/racket_ready/s4.png" data-fancybox="gallery" data-caption="Screenshot 4 - Put price">
<img src="/img/racket_ready/s4.png" alt="Screenshot 4 - Leagues">
</a>
</div>
</div>
</div>
</div>
</div>
<div class="wave">
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none">
<path d="M321.39,56.44c58-10.79,114.16-30.13,172-41.86,82.39-16.72,168.19-17.73,250.45-.39C823.78,31,906.67,72,985.66,92.83c70.05,18.48,146.53,26.09,214.34,3V0H0V27.35A600.21,600.21,0,0,0,321.39,56.44Z" class="shape-fill"></path>
</svg>
</div>
</div>
</section>
<section id="skills" class="section-light">
<div class="content">
<h2>Skills</h2>
<div class="skills-widget">
<div class="skill" onclick="toggleSkillDescription(this)">
<div class="skill-title">Python</div>
<div class="skill-description">Used Python extensively at university in the AI, machine learning, and visual computing modules, for example to implement machine learning models using numpy and pytorch, and visual computing techniques using OpenCV, as well as for personal skills.</div>
</div>
<div class="skill" onclick="toggleSkillDescription(this)">
<div class="skill-title">Golang</div>
<div class="skill-description">Self-taught Golang before starting my internship at Confluent by solving Leetcode problems, and have since used it extensively for projects related to Kubernetes, and writing unit tests.</div>
</div>
<div class="skill" onclick="toggleSkillDescription(this)">
<div class="skill-title">Java</div>
<div class="skill-description">Self-taught Java to explore object-oriented programming, using it for a number of personal projects. Java has also been a key language used in my studies, particularly for the frontend of our 1st year group agile skill" should be "Java has also been a key language in my studies, particularly for the frontend of our 1st-year group agile project.</div>
</div>
<div class="skill" onclick="toggleSkillDescription(this)">
<div class="skill-title">C</div>
<div class="skill-description">Explored programming concepts such as memory management and bitwise operations using C at university in the systems architecture and programming modules, and then applied these skills in Arduino projects, including developing a smart-blind system that combined both hardware and software components.</div>
</div>
<div class="skill" onclick="toggleSkillDescription(this)">
<div class="skill-title">Git</div>
<div class="skill-description">I use GitHub and git commands in the command line daily, both as part of my internship and for personal projects.</div>
</div>
<div class="skill" onclick="toggleSkillDescription(this)">
<div class="skill-title">Linux</div>
<div class="skill-description">I frequently use Linux commands both on my personal computer running the Linux Mint distribution, and as part of my internship, using them within macOS.</div>
</div>
<div class="skill" onclick="toggleSkillDescription(this)">
<div class="skill-title">LaTeX</div>
<div class="skill-description">Used LaTeX throughout university for writing reports and mathematical work, as well as incorporating LaTeX into the readmes of some personal skills.</div>
</div>
<div class="skill" onclick="toggleSkillDescription(this)">
<div class="skill-title">AWS</div>
<div class="skill-description">Experienced in using AWS for Kubernetes deployments during my internship at Confluent, including managing EKS clusters, configuring IAM roles, setting up VPCs and EC2 instances, and utilizing S3.</div>
</div>
<div class="skill" onclick="toggleSkillDescription(this)">
<div class="skill-title">Google Cloud</div>
<div class="skill-description">Used Google Cloud Platform for both personal projects, including running Golang scripts with Cloud Functions, and during my internship at Confluent, managing GKE clusters.</div>
</div>
<div class="skill" onclick="toggleSkillDescription(this)">
<div class="skill-title">Azure</div>
<div class="skill-description">Managed Microsoft Azure AKS clusters during my internship at Confluent</div>
</div>
<div class="skill" onclick="toggleSkillDescription(this)">
<div class="skill-title">Docker</div>
<div class="skill-description">Used Docker for containerizing applications and deploying them to kubernetes clusters as part of training for my internship at Confluent.</div>
</div>
<div class="skill" onclick="toggleSkillDescription(this)">
<div class="skill-title">Terraform</div>
<div class="skill-description">Experienced using the infrastructure as code tool Terraform during my internship at Confluent for managing Kubernetes clusters across AWS, Azure, and GCP, and provisioning resources such as VPCs and Iam roles.</div>
</div>
<div class="skill" onclick="toggleSkillDescription(this)">
<div class="skill-title">HTML and CSS</div>
<div class="skill-description">Completed the freeCodeCamp HTML and CSS course, putting the skills into practice to make this website, and a website for a small business.</div>
</div>
<div class="skill" onclick="toggleSkillDescription(this)">
<div class="skill-title">SQL</div>
<div class="skill-description">Gained a foundation in SQL and the relational algebra theory behind it in the Discrete Mathematics and Databases module, and put it into practise in a Golang web server project that I built based on the book "Let's Go - Alex Edwards" .</div>
</div>
<div class="skill" onclick="toggleSkillDescription(this)">
<div class="skill-title">React and Typescript</div>
<div class="skill-description">As part of the Experimental Systems Project at University, I worked in a team of 8 to develop "Racket Ready", a racket-sports matchmaking app, contributing to numerous components of the React and Typescript frontend</div>
</div>
<div class="skill" onclick="toggleSkillDescription(this)">
<div class="skill-title">Quantitative Finance Knowledge</div>
<div class="skill-description">
I first read <em>"Quantitative Finance For Dummies" by Steve Bell</em> to explore some of the key concepts in quantitative finance. Currently, I'm working through <em>"Options, Futures, and Other Derivatives" by John Hull</em>, to gain a deeper understanding in some areas such as modelling stock price behavior and option pricing models. I've applied this knowledge through working through the exercises in the book, and implementing option pricing theories in a Python calculator and visualization tool.</div>
</div>
</div>
<div class="wave">
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none">
<path d="M321.39,56.44c58-10.79,114.16-30.13,172-41.86,82.39-16.72,168.19-17.73,250.45-.39C823.78,31,906.67,72,985.66,92.83c70.05,18.48,146.53,26.09,214.34,3V0H0V27.35A600.21,600.21,0,0,0,321.39,56.44Z" class="shape-fill"></path>
</svg>
</div>
</div>
</section>
<section id="education" class="section-dark">
<div class="content">
<h2>Education</h2>
<h3><strong>BSc Computer Science with Year in Industry</strong> - University of Bath (09/2022 - 06/2026)</h3>
<details>
<summary class="floating"><h4 id="year2-header">2nd year modules | 81%</h4><p>▶</p></summary>
<div id="year2-content">
<ul>
<li><strong>Machine learning</strong>: 85% – Studied neural networks (including convolutional, GANs, large-language models), and other supervised/unsupervised techniques such as regression, Naive-Bayes, PCA, and Gaussian Mixture Models - implementing each in Python.</li>
<li><strong>Data Structures and Algorithms</strong>: 85% – Learnt about the mathematics behind sorting, hash tables, graphs, and trees, data collections, and cryptography, with a focus on proving the correctness of the algorithms, and determining their complexity, alongside implementing each in Java.</li>
<li><strong>Experimental Systems Project</strong>: 73% – Took "Racket Ready", a racket-sports matchmaking app concept, through the entire software engineering lifecycle in a team of 8, from coming up with the initial idea, to requirements design, agile development, testing, and evaluation, ultimately producing a mobile app in React.</li>
<li><strong>Foundations of Computation</strong>: 84% – Explored fundamental models of computation, including deterministic and non-deterministic finite automata, regular and context-free languages, Turing machines, and the Church-Turing thesis.</li>
<li><strong>Comparative Programming Languages</strong>: 93% – Discussed the question "How do you pick the right programming language?", by comparing concepts such as types, compilers, memory management, programming paradigms, and object-oriented programming. </li>
<li><strong>Fundamentals of Visual Computing</strong>: 89% – Investigated visual computing concepts from image filtering, the Fourier Transform, and lighting models, to curves, and textures rendering, and then implementing these concepts in Python.</li>
<li><strong>Functional Programming</strong>: 63% – Studied lambda calculus, the theoretical foundation of functional programming, and applied the theory to programming in Haskell.</li>
<li><strong>Human-Computer Interaction and User Experience</strong>: 81% – Applied HCI and user-experience theories to design a VR "Lego Builder" app, working in a group to develop low and high-fidelity prototypes, conduct user testing, and perform statistical analysis on the data.</li>
</ul>
</div>
</details>
<details>
<summary class="floating"><h4 id="year1-header">1st year modules | 77% </h4><p>▶</p></summary>
<div id="year1-content">
<ul>
<li id="spam"><strong>Software Processes and Modelling</strong>: 77% – Led a team of 5 as Scrum Master in developing a fitness app. I led the development of the Java frontend, organised meetings, and learnt how software projects can be effectively organised using agile development and object-oriented programming.</li>
<li><strong>Mathematics for Computation</strong>: 78% – Studied fundamental topics in mathematical analysis crucial to Computer Science, including linear algebra, derivatives, and series.</li>
<li><strong>Principles of Programming</strong>: 79% – Gained the skills to quickly pick up and solve problems in any language. I became proficient in Python and Java, and explored memory management with C.</li>
<li><strong>Discrete Mathematics and Databases</strong>: 82% – Developed knowledge of logic, maps, and relational algebra, then applied it to databases and SQL.</li>
<li><strong>Artificial Intelligence</strong>: 69% – Explored a broad range of AI concepts, from search techniques and constraint satisfaction, to probability and machine learning. I used Python to implement each concept, with a focus on writing fast code, and was inspired to explore deep learning beyond the unit.</li>
<li><strong>Computer Systems Architecture</strong>: 79% – Gained a deeper understanding of how computers work at varying levels of abstraction, focusing on logic, hardware, and data representation, which was put into practise with group Arduino projects using C++, while semester 2 focused on operating systems and networks.</li>
</ul>
</div>
</details>
<h3 class="gapAbove"><strong>A-Levels</strong> - Wymondham College (09/2020 - 07/2022)</h3>
<h4 class="gapUnder">A* Maths, A Further Maths, A* Physics, A* Geography</h4>
<h3><strong>GCSEs</strong>, Wymondham College (09/2015 - 07/2020)</h3>
<h4>10 grade 9s, 1 grade 8, and 1 grade 7</h4>
<div class="wave">
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none">
<path d="M321.39,56.44c58-10.79,114.16-30.13,172-41.86,82.39-16.72,168.19-17.73,250.45-.39C823.78,31,906.67,72,985.66,92.83c70.05,18.48,146.53,26.09,214.34,3V0H0V27.35A600.21,600.21,0,0,0,321.39,56.44Z" class="shape-fill"></path>
</svg>
</div>
</div>
</section>
<section id="work-experience" class="section-light">
<div class="content">
<h2>Work Experience</h2>
<h3 id="confluent-internship"><strong>Software Engineering Internship</strong> - Confluent (05/2024 - 05/2025)</h3>
<p>I am currently on a software engineering internship at Confluent, working as a cloud infrastructure engineer within the Kubernetes platform team –
the team that manages the Kubernetes clusters running Confluent Cloud, a Kafka-based real-time data streaming service.
I’ve gained hands-on experience with "Kubernetes, Golang, Linux, Git commands, Terraform, AWS, GCP, Azure, Docker, and Helm, by delivering several projects, including:
<ul>
<li>Reducing Datadog metric cardinality, resulting in approximately $30,000/month savings.</li>
<li>Resolving an Azure Storage Accounts quota monitoring issue by creating new metrics and unit tests using Go.</li>
<li>Migrating several internal app installations from Terraform to Flux using Helm charts and kubectl.</li>
</ul>
<h3 class="gapAbove"><strong>Peer Assisted Learning Leader</strong> - University of Bath (09/2023 - 05/2024)</h3>
<p class="gapUnder">I volunteered to lead multiple tutorial-style sessions per week, as part of a team, to the 1st year Computer Science cohort, recapping all the material learnt in lectures, getting regular experience presenting to a large group, alongside keeping the Computer Science content I learnt in 1st year fresh in my memory.</p>
<h3><strong>Outdoor Activities Instructor</strong> - Hautbois Activity Centre (04/2022 - 05/2024)</h3>
<p>I led a variety of outdoor activities to groups of young people, taking responsibility for participants, instructing with enthusiasm and maintaining high standards. I encouraged teamwork amongst groups, and often worked collaboratively with other instructors.
</p>
<div class="wave">
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none">
<path d="M321.39,56.44c58-10.79,114.16-30.13,172-41.86,82.39-16.72,168.19-17.73,250.45-.39C823.78,31,906.67,72,985.66,92.83c70.05,18.48,146.53,26.09,214.34,3V0H0V27.35A600.21,600.21,0,0,0,321.39,56.44Z" class="shape-fill"></path>
</svg>
</div>
</div>
</section>
<footer>
<p>2024 Thomas Canning | <a href="mailto:[email protected]">[email protected]</a></p>
</footer>
</body>
</html>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.js"></script>
<script>
document.querySelectorAll('details').forEach(details => {
details.addEventListener('toggle', () => {
const summary = details.querySelector('summary');
if (details.open) {
summary.classList.add('expanded');
} else {
summary.classList.remove('expanded');
}
});
});
function toggleSkillDescription(skill) {
const description = skill.querySelector('.skill-description');
// Hide all other project descriptions and remove .no-hover class
document.querySelectorAll('.skill').forEach(skillInstance => {
if (skillInstance !== skill) {
skillInstance.classList.remove('no-hover');
skillInstance.querySelector('.skill-description').style.display = 'none';
}
});
if (description.style.display === 'block') {
description.style.display = 'none';
skill.classList.remove('no-hover');
} else {
description.style.display = 'block';
skill.classList.add('no-hover');
}
}
function toggleProjectDescription(project) {
const description = project.querySelector('.project-description');
const icon = project.querySelector('.skill-icon');
const githubLink = project.querySelector('.github-link');
const projectWidgetTop = document.querySelector('.project-widget-top');
const projectWidgetBottom = document.querySelector('.project-widget-bottom');
const isWideScreen = window.innerWidth > 950;
// Store the original index in the bottom widget (if not already stored)
if (!project.dataset.originalIndex) {
project.dataset.originalIndex = Array.from(projectWidgetBottom.children).indexOf(project);
}
document.querySelectorAll('.project').forEach(projectInstance => {
if (projectInstance !== project) {
projectInstance.classList.remove('no-hover');
projectInstance.querySelector('.project-description').style.display = 'none';
projectInstance.querySelector('.skill-icon').style.display = 'flex';
projectInstance.querySelector('.github-link').style.display = 'flex';
}
});
const isInTopWidget = project.classList.contains('top-widget-project');
// If the project is in the top widget and clicked again, move it back to its original position
if (isInTopWidget && isWideScreen) {
restoreToOriginalPosition(project, projectWidgetBottom); // Move back to original position
project.classList.remove('top-widget-project'); // Remove top-widget class
description.style.display = 'none';
} else {
// If the screen is wide, handle project moving between top and bottom
if (isWideScreen) {
const currentTopProject = projectWidgetTop.querySelector('.top-widget-project');
// If there's already a project in the top widget, move it back to its original position
if (currentTopProject) {
restoreToOriginalPosition(currentTopProject, projectWidgetBottom);
currentTopProject.classList.remove('top-widget-project');
}
// Move the clicked project to the top widget and hide the icon and GitHub link
projectWidgetTop.appendChild(project);
project.classList.add('top-widget-project');
}
// Toggle the description visibility for the selected project
description.style.display = description.style.display === 'block' ? 'none' : 'block';
}
if (description.style.display === 'block') {
project.classList.add('no-hover');
icon.style.display = 'none';
githubLink.style.display = 'none';
} else {
project.classList.remove('no-hover');
githubLink.style.display = 'flex';
icon.style.display = 'flex';
}
}
function restoreToOriginalPosition(project, projectWidgetBottom) {
const originalIndex = parseInt(project.dataset.originalIndex, 10);
const siblingProjects = Array.from(projectWidgetBottom.children);
// Move the project back to its original position or append to the end if index is out of bounds
if (originalIndex >= siblingProjects.length) {
projectWidgetBottom.appendChild(project);
} else {
projectWidgetBottom.insertBefore(project, siblingProjects[originalIndex]);
}
}
</script>