<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Damian Sandhu-Franceschi on Medium]]></title>
        <description><![CDATA[Stories by Damian Sandhu-Franceschi on Medium]]></description>
        <link>https://medium.com/@damiansandhu11?source=rss-79c00aeb5775------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*_GwZSnV5_wUzVm-LqUmHgw.png</url>
            <title>Stories by Damian Sandhu-Franceschi on Medium</title>
            <link>https://medium.com/@damiansandhu11?source=rss-79c00aeb5775------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Mon, 18 May 2026 06:31:34 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@damiansandhu11/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[The University of Guelph’s Bachelor of Computing, a Review From a Recent Graduate]]></title>
            <link>https://medium.com/@damiansandhu11/the-university-of-guelphs-bachelor-of-computing-a-review-from-a-recent-graduate-e37dcd35affa?source=rss-79c00aeb5775------2</link>
            <guid isPermaLink="false">https://medium.com/p/e37dcd35affa</guid>
            <category><![CDATA[advice]]></category>
            <category><![CDATA[education]]></category>
            <category><![CDATA[university-of-guelph]]></category>
            <category><![CDATA[software]]></category>
            <category><![CDATA[university]]></category>
            <dc:creator><![CDATA[Damian Sandhu-Franceschi]]></dc:creator>
            <pubDate>Tue, 09 Jun 2020 00:25:13 GMT</pubDate>
            <atom:updated>2020-06-09T00:33:51.654Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Yz_MDsb9fYe3jmjcY9crNw.jpeg" /></figure><p>As a recent graduate of the University of Guelph, I felt like publishing my notes and experiences to hopefully assist future/current students (I&#39;m also stuck in quarantine and am extremely bored, so why not write an article!).</p><p>This article will start off with a comparison between the Computer Science and Software Engineering programs at the school and a small blurb about COOP. I&#39;ll then give a general review of the program followed by a more detailed review of each semester, along with some tips. Finally ill write a little blurb about every single course the school currently offers for Computer Science/Software Engineering students, talk about the elephant in the room (The University of Waterloo), and ill try and come up with some sort of conclusion for this article.</p><p>Below is a link to every version of the Computing program at the school, these pages state the various program requirements. Change the year range within the URL if you are reading this article in any year other than the 2020–2021 school year:</p><p>Computer Science COOP:</p><p><a href="https://www.uoguelph.ca/registrar/calendars/undergraduate/2020-2021/c10/c10bcomp-sofs-c.shtml">X. Degree Programs</a></p><p>Computer Science:</p><p><a href="https://www.uoguelph.ca/registrar/calendars/undergraduate/2020-2021/c10/c10bcomp-sofs.shtml">X. Degree Programs</a></p><p>Software Engineering COOP:</p><p><a href="https://www.uoguelph.ca/registrar/calendars/undergraduate/2020-2021/c10/c10bcomp-seng-c.shtml">X. Degree Programs</a></p><p>Software Engineering:</p><p><a href="https://www.uoguelph.ca/registrar/calendars/undergraduate/2020-2021/c10/c10bcomp-seng.shtml">X. Degree Programs</a></p><p>General Program:</p><p><a href="https://www.uoguelph.ca/registrar/calendars/undergraduate/2020-2021/c10/c10bcomp-info.shtml">X. Degree Programs</a></p><h3>Why You Shouldn’t Choose Software Engineering</h3><p><em>Before I dive into this, I will say that I was in Computer Science COOP at the University, just for transparency&#39;s sake. But I did know a lot of people in Software Engineering.</em></p><p>As you can probably tell by the title of this section, I&#39;m not a fan of the Software Engineering degree. Even if you do a General degree id encourage you to take courses directly from the Computer Science calendar rather than the Software Engineering one. Why you might ask? the required Software Engineering courses are a joke and the degree does not require/allow you (due to semester/time slot conflicts) to take the theory courses that the Computer Science students take.</p><p>Computer Science students take theory courses, Software Engineering kids take group project courses that teach you the same concepts you&#39;ve either learned during internships or have learned in other courses you have already taken. Now there are 3 Software Engineering courses that I would recommend everyone take: Software Design I (CIS*1250), Software Reliability and Testing (CIS*4150) and Human Computer Interaction (CIS*4300). The first course gives you a good, first semester, introduction to the software industry and practices. The other two courses are good at filling in gaps you have within your testing and UI design skills. All other required Software Engineering courses, in my opinion, are useless and should be avoided.</p><p>I&#39;ll give the school some credit in that they now require Software Engineering students to take algorithms (a recent change) which is a step in the right direction. But really, these students still miss out on courses that teach them basic theory that they will need in the industry. Graph theory, NP-completeness, Finite Automata, Counting Theory, and more. These are all key concepts that apply to everyday programming and working in the industry heavily. Missing out on learning these concepts is an absolute tragedy and screws you over when the time comes to interview for jobs and whenever you code.</p><p>The Software Engineering degree is much easier than the Computer Science degree, so if all your looking for is a quick and easy degree that will turn you into a programmer and you have the motivation to actually teach yourself the key theory and concepts you need to know that are taught in Computer Science then take it. If you want a complete degree that fully prepares you for working in the software industry and teaches you everything you need to know to build a solid base then take Computer Science. In my opinion, don&#39;t waste your time taking bullshit group project courses that reteach the same concepts every semester, take the program that challenges you and teaches you things you actually need to know, without repetition. University isn&#39;t meant to be easy if it is you might be doing something wrong.</p><h3>Why You Should Choose COOP</h3><p>You might think to yourself, “5 years vs 4 years, definitely doing 4 years and skipping COOP”, I thought like this originally as well, till my friend told me I was being an idiot.</p><p>I cannot recommend COOP enough. Yes, you are doing an extra year of school but you&#39;re not doing any extra school semesters, you just get 5 terms in which you can take time to do internships. You do get 3 summers in which you can look for internships in the regular degree as well but 5 &gt; 3, your probably not going to find a placement after first year since really you don&#39;t know all that much, and companies get government tax credits for hiring COOP students so fewer companies are going to want to hire you.</p><p>COOP gives you the opportunity to look for internships throughout your degree at various points in the year (summer, winter, and fall) and gives you a nice break in between school semesters (can make some money to pay off your student debts and so you can buy top-shelf ramen at the grocery store). COOP also provides you with a simple job application website and interview space organized by the University as well as advisors who are there to help you find some sort of computing job every work term. The University of Guelph’s COOP program does need a lot of work, it&#39;s much smaller than other schools such as Waterloo, and the number of quality jobs they have is quite low. But its constantly improving, Guelph students are highly renowned in the industry and more companies are hiring out of the school. You can also apply to jobs external of the University’s system at any time, companies don&#39;t have to hire you through the University to get that tax credit I mentioned.</p><p>The only thing I absolutely hate about the University’s COOP program is that they don&#39;t have advisors who have actually worked in the software industry nor do they have a round-based hiring system like Waterloo. The lack of advisors leads to you not getting the best advice for applying to jobs (Software resumes are unique, much simpler than any other industry, something that the school&#39;s advisors don&#39;t really understand. Also, cover letters aren&#39;t generally a thing in the industry yet they try and shove the statement “you should write cover letters” down your throat constantly). The lack of a round-based hiring system leads to students accepting jobs they applied to as “backups” before they hear if they got the jobs they actually wanted. At Waterloo, job offers come in rounds, meaning you interview and then get all your offers at once so you can make a more informed decision. They repeat this rounds process 2 times before the free for all starts. Guelph just uses the free for all format. What happens is that companies, usually the “lower tier” ones&#39;, interview early and get their offers out within the first few days of the job search. The “higher tier” companies usually take much longer to interview and get offers out. You can only turn down a single job offer per job search term so once you get 2 job offers you&#39;re left with a few days to make a decision. Usually, people end up just taking one of the 2 or more offers they received since they don&#39;t want to risk not getting a job at all. Doing this leads to them missing out on ever interviewing with or hearing back from other companies they applied to. I luckily never got screwed over by this job search system and completed 5 extremely solid work terms with 3 companies I wanted to work for, but I do know a lot of people who got screwed. I do have faith in the University to bring in more advisors from the industry and to fix this free for all problem. When will they actually do it? who knows.</p><p>Overall, yes, yes you should take COOP. If you don&#39;t get into it through your application to the school from high school, work your ass off in first year to get into it. The COOP program at Guelph does have its downfalls, but like I said, it&#39;s constantly improving and the advantages easily outweigh the disadvantages, some internship experience is always better than none.</p><h3>General Review + Tips</h3><p>Overall I had a decent experience with the University of Guelph, I learned pretty much the exact same things as my friends at competing University’s (Mainly the University of Waterloo), gained a solid knowledge of software development and theory, and was able to launch my career through various internship opportunities. The school, like most, has some problems with questionable professors (some of which, in my opinion, should not be teaching anymore) however we are in an industry where pretty much any concept can be learned online. The school’s gradually growing bigger and is hiring on more staff so I have faith in the program to develop into a top computer science program in the future, if the school plays its cards right.</p><p>One more “complaint” I thought of was that the school uses the C programming language as its main language for the program. I don&#39;t mind C, I think it&#39;s a good language to start in but I feel as though an OOP language like C++ might be a better choice. Not a big deal though. Schools don&#39;t exist to teach you programming languages, they exist to teach you how to program and how to learn. The school does have more classes that use languages such as Java, Python, and Javascript in the upper years, but most of the lower year courses are in C.</p><p>The University also has quite a few graduate programs including a new software security program. I have only heard good things about the graduate programs but do not know much about them my self.</p><p>Below are some general tips:</p><ul><li>Start assignments early. Yes I know you have probably heard this 9001 times, you can get away with slacking off in first year and parts of second year, after that, not so much.</li><li>Spend time outside of the classroom expanding your knowledge. School gives teaches you the basics, it&#39;s on you to look deeper into these topics so you can truly master them. Work on side projects, contribute to open source, attend hackathons, read books, practice problems on Leetcode and HackerRank. School can only get you so far, if you want to land your dream job you need to do things outside of school and you can never stop doing things on the side, even when you are working.</li><li>Build connections. Talk with your peers, your professors, and your TA’s, you will almost always learn something new from them and maybe even give yourself a gateway into companies they work for in the future.</li><li>Attend job fairs. Pretty obvious as to why you should do this. It can get you a job and at the bare minimum an interview and a connection.</li><li>Constantly challenge yourself. Never settle, if you&#39;re not challenging yourself your giving up. You need to always be learning, you will struggle at first but the more and more you learn the easier it gets, and the more you know the easier finding a job will be.</li><li>Review Professors and TA’s. If you have had a crap experience with a professor or a TA, make sure to fill out the assessments that get sent out at the end of each term, otherwise, things will never change. If things are going really bad during the semester, reach out to the computer science school admin and give them your feedback. They exist to help provide you with the best educational experience possible, and in most cases, they will intervene to attempt to solve your issues.</li><li>Pick an area of application you enjoy. The school forces you to complete an area of application, essentially a minor minus 1.0 credits. Utilize your first year to try out a variety of courses, business, psychology, whatever piques your interest and choose your area of application-based on what you enjoy the most. Don&#39;t pick one because it&#39;s easy, your paying for these classes, do something you genuinely enjoy.</li><li>The internet is your best friend, learn how to use it wisely. In software development, the internet is like Heaven, if you ever need a question answered you can usually find the answer online, or at least some more information that will help you answer the question on your own. Pretty much every programming language and theory concept has a plethora of online search results that can help you greatly. Learn how to properly research and your life will become a lot easier.</li><li>Take computing electives. If a computing course interests you, or is related to a field you want to get into, take it. Don&#39;t worry about how hard it is, taking it will only benefit you.</li><li>Negotiate internship salaries and lengths. Never settle, a company won&#39;t revoke an offer because you are trying to negotiate it (unless you are being rude about). And try to negotiate for 4-month terms only. Even if it is your dream company you might hate the job after the first 4 months, if you love it you can always request an extension.</li></ul><h3>Semester Review + Tips</h3><p>For this section, I&#39;m just going to go over every semester, my experience and thoughts, and any tips I have. Keep in mind I was in Computer Science with COOP, so this section won&#39;t really fully apply to you if you&#39;re in Software Engineering, and the semester layout I describe might be slightly different than yours if you are in a non-COOP program. Also just a note, I was in school for the 2015–2016 calendar, but I have made this review to adhere to the 2020–2021 calendar.</p><h4>Semester 1</h4><p>When I was in this semester the only required courses were Programming (CIS*1300) and Calculus I (MATH*1200). Programming (CUS*1300)will be a breeze if you have previous programming experience, but still, pay attention to the course content as it might fill some knowledge gaps in for you. Calculus I (MATH*1200) is also not too bad, depending on how well your high school math teacher prepared you, but it definitely takes a lot of effort to come out of it with a good grade. Make sure to get help if you need it.</p><p>Overall I found this semester to be fairly easy, its your first semester so that is expected. They recently pushed up Discrete Structures in Computing I (CIS*1910) into this semester (previously it was in term 2). This course is fairly challenging, it introduces you to the basics of Computer Science theory and a lot of people I know, including myself, struggled in it. Make sure to pay attention in this class as you&#39;ll need the knowledge from it going forward. Youtube is your best friend for this class, if you don&#39;t understand a concept in it, look up a video, this applies to all the theory courses throughout the degree. Study hard for the midterm and final.</p><p>The Programming (CIS*1300) course can sometimes be difficult, even for experienced programmers, due to you having to adjust to following a spec and being graded under a magnifying glass. Make sure to read all information the professor provides you for assignments and labs meticulously, and ask questions if you&#39;re unsure of something.</p><p>I recommend taking Software Design I (CIS*1250) as an elective this semester if you are in Computer Science. It gives you some good base knowledge about software design and development.</p><p>Use this semester’s electives to figure out what you want to do as an Area of Application.</p><h4>Semester 2</h4><p>When I was in this semester the only required course was Intermediate Programming (CIS*2500). Its a step up from the intro course of term 1 and begins to introduce memory and data structures in C. It can be a bit of a pain at first, and you are definitely going to learn a lot more than in the intro course, but as long as you stay on top of assignments and ask questions when you are stuck you should be fine.</p><p>The school now requires students to take Linear Algebra I (MATH*1160) and Discrete Structures in Computing II (CIS*2910) during this term. I have never taken Linear Algebra I (MATH*1160), but from what I have heard, it&#39;s not too bad, if you&#39;re bad with math though you may struggle. Its contents should help you throughout your degree and career. Discrete Structures in Computing II (CIS*2910) is an absolute pain, I found the course really difficult, and it begins to introduce some more key, yet more complex, theory concepts. Just like the first course, pay attention, do your work, research online, study hard, and ask questions when you&#39;re stuck.</p><p>Use this semester to nail down the area you want to do your area of application in and don&#39;t slack off. With the added required courses I could see this semester being extremely difficult for first-year students.</p><p>Use your first and only summer off to learn things on the side. Contribute to open-source, read a book, create a side project, attend a hackathon, etc... Pad your resume and increase your knowledge and skills</p><h4>Semester 3</h4><p>This semester is where things start to kick off. You have a heavy course load and are also probably starting to worry about COOP and your area of application courses.</p><p>Structure and Application of Microcomputers (CIS*2030) is a heavy course, plenty of content, plenty of assignments, and plenty of labs. A lot of people I know struggled in this class, I found it easy because I was very interested in the content but I think I was a minority. Keep your head down, start things early, and ask a lot of questions. The professor may seem tough and scary but he&#39;s actually a nice guy. The course deals with assembly language and low-level concepts so it might be a bit shocking at first.</p><p>Object-Oriented Programming (CIS*2430), this course isn&#39;t too bad since its just teaching you the basics of OOP and Java. Its fairly simple at the beginning but the new concepts and new way to think of programming can confuse you. Like any course, utilize online resources and the knowledge of your peers. Keep up with the assignments and labs and try not to slack off, it will bite you in the ass.</p><p>Data Structures (CIS*2520). This course is a pain, it introduces you to key data structures in computing and teaches you how to create them and all about why they exist. It is a pain in the ass because it is in C, so be ready to deal with a bunch of memory errors, you may have a few late nights in this course. Do not slack in this class, it will catch up to you and swallow you whole. The content of this course is extremely important for a programmer to know.</p><p>Introduction to Co-operative Education (COOP*1100), this course is a joke, I&#39;m not sure why it exists really. It&#39;s not worth any credits and just forces you to write a resume that fits the course professors&#39; standards (generally the resume you come out with from this course is crap). Don&#39;t focus on this course, just pass it and move on.</p><p>Use the winter break to create a solid resume. Keep an eye out for internships outside of the University’s system. Big company internships usually open up applications in October/November for the summer.</p><h4>Semester 4</h4><p>This is the toughest semester of the degree, its the weeding semester. You&#39;re faced with a COOP job search + interviews, 2 hard courses, and T<a href="https://open.spotify.com/track/7KOHzmLzRDR2mwbgQilAtj?si=3SLax1JxQzSgXswo0XuBzA">he Angel of Death</a>. DO NOT SLACK OFF WHATEVER YOU DO.</p><p>Operating Systems I (CIS*3110), I hated this class, it teaches you some good concepts such as threading but I just hated it. The content was dry, it was all taught in a super old fashion way and the course was tough. Just pay attention in class and talk with your peers a lot in this course. You are in for a ride, do not fall behind.</p><p>The Analysis and Design of Computer Algorithms (CIS*3490), this class is really tough. The content isn&#39;t exciting, the professors generally aren&#39;t great and the assignments and tests are not easy. Don&#39;t put this course on the back burner, learn as much as you can from it and research its topics online to learn even more. Algorithms are a core computing topic and will help you out in interviews.</p><p><a href="https://open.spotify.com/track/7KOHzmLzRDR2mwbgQilAtj?si=3SLax1JxQzSgXswo0XuBzA">The Angel of Death</a>, Software Systems Development and Integration (CIS*2750). This course has a notorious reputation. You will definitely hear about it before this semester and you will fear it. When I took it I believe the drop fail rate was around 85%. It absolutely wrecked me. I was extremely swamped this term and this class is an absolute gong show. They have made the course a lot easier now, the drop fail rate has decreased significantly, and they brought in new professors. However, the course is still one of the hardest classes you will take. My only advice to you is to start the assignments the second they are released, ask questions as soon as you think of them, and don&#39;t fall behind. If you do this, you will be spared. Also don&#39;t not study for the midterm and final, you can study for a day for these and use them to boost your grade. Write good expandable code and always aim to get 100 on every assignment, they all build off each other and the TA’s/Professor regression test your previous assignments as part of your grade for the newer ones(This applies for most upper-year courses).</p><p>COOP job search, your first job search is an exciting time. You are about to take an 8-month break from school and learn 10x the amount of things you learned in the last 2 years of school in the upcoming 8 months. My advice to you is to apply to as many jobs as possible, even ones you may not like. This first job search is really just about getting any job and getting some initial experience for your resume. I applied to over 80 jobs in this term and took the first one I got. Try to negotiate for a 4-month placement so that you can move on for the second term if you really don&#39;t like your job (you can always ask for an extension). Once you start working make sure to network, learn from your coworkers and put your heart into your work, you need to make a lasting impression, doing so will only help you in future job searches.</p><p>Try to take easy electives this term, for your own sake.</p><h4>Semester 5</h4><p>This semester will feel weird at first since your coming off of 8 months of working and have to get right back into school + job search. Just take some time to readjust, I highly recommend taking an online course during work terms, even a bird course, this will keep you in a somewhat academic mindset.</p><p>You only have 1 required course this term and it’s System Analysis and Design in Applications (CIS*3750). This course is a joke, its a group project course and is fairly easy. The professor might throw a lot of work at you for fun but this course will teach you a lot of things you already know from previous classes/COOP. It may fill some gaps in for you but overall it is super simple.</p><p>Take a computer science elective that interests you this term and focus on your area of application.</p><p>For your COOP job search, since you are entering your 3rd work term you can be a bit more selective of companies that you apply to. Pick ones that interest you, look for positions outside of the COOP system, and try to get an internship that you know you will really enjoy and learn a lot from. Go back to your previous company if you need to, but its generally better to try something new.</p><h4>Semester 6</h4><p>This semester can be a bit rough for one reason and one reason only, Theory of Computation (CIS*3150). I don’t know a single person who did not struggle in this course, it teaches advanced computer science theory including np-completeness, Turing machines, and finite automata. Make sure you remember your previous theory course content and be sure to keep up with this class. Study continuously throughout the term otherwise the midterm and final will kill you and the assignments will deface your grave.</p><p>The other two courses required this term are fairly easy. Software Engineering (CIS*3760) kind of reiterates over what System Analysis and Design in Applications taught you with some new concepts and once again, a group project. This course is more oriented towards the group project and heavily focuses on the software process. You probably won&#39;t learn anything new and if you do it will either be useless or will fill a gap in your knowledge. The other required course is Statistics I (STAT*2040), fairly simple and straight forward, you can take it earlier than this term if you want. The course will teach you basic statistics, a bit about R and that&#39;s it. Some professors that teach it allow you to use cheat sheets on the tests which is nice.</p><p>Focus hard on Theory of Computation (CIS*3150), make sure you pass it and take electives to help you with your area of application. Take a computing elective if you are able to.</p><p>For this COOP search be extremely selective, try and get a 4-month COOP at a company you really want to work for, and be more aggressive with negotiating salary, you are more experienced and more wanted at this point. If you like the job you get, extend it for another 4 months, if not, search for a new one for the second 4 months.</p><h4>Semester 7</h4><p>This semester will be hard at first, you are once again coming off of 8 months of internships except this time you can see the light at the end of the tunnel, graduation. Don&#39;t slack off, keep grinding and keep focused, otherwise you might screw up. Take electives that challenge you and that prepare you for the real world and spend time this semester refining your resume and applying for full-time jobs or master&#39;s programs. Do an undergraduate research project if you think you may be interested in a master&#39;s. If you find out you hate doing research, a master’s might not be right for you.</p><p>Chances are you will have some full-time job interviews during this term. These are a new beast, make sure you practice your basics. Leetcode is your friend.</p><p>I highly recommend taking Software Reliability and Testing (CIS*4150)and Human Computer Interaction (CIS*4300)during this semester. They are Software Engineering required courses that teach valuable skills and can fill in some blanks in your skillset.</p><h4>Semester 8</h4><p>The end of the journey, you have finally made it, your final term. This term was tough for me personally, I had secured my full-time job and was fighting off “senioritis” aka the urge to stop caring about school. Do not succumb to senioritis, I&#39;ve seen many succumb to it and they were more or less saved by the Bell that was COVID-19 forcing classes online and canceling finals. This semester will mostly be electives for you, potentially an undergraduate research project, and will probably be fairly stressful as you try to figure out what you want to do with your life.</p><p>Focus on interviewing for full-time jobs, and applying for grad school. But keep focussed on the contents of your final semester as well, you might just learn something new that will help you in the future.</p><p>The one required course this semester is Compilers (CIS*4650). A lot of people are scared of this course, I know I for sure was. The course content isn&#39;t really that relevant, it uses theory you learned throughout your degree and teaches you a bunch of stuff you will probably never actually use. The term project is to build a compiler, its not too bad of a task but I definitely recommend taking the pairs option and doing it with a good friend. You use some weird tools and write a bunch of code that you hope will work but as long as you start early the project will go smoothly. The project checkpoints are graded in person as well so you can probably talk your way around some program errors :). The midterm for the course was fairly challenging, youtube is your best friend. I never wrote the final because of COVID-19 but from what I have heard the midterm is harder than the final.</p><h3>My Notes on Every Computer Science Course Currently Offered</h3><p>You can view a list of courses offered and the requirements here:</p><p><a href="https://www.uoguelph.ca/registrar/calendars/undergraduate/2020-2021/c12/c12cis.shtml">XII. Course Descriptions</a></p><p>Change the year range within the URL if you are reading this article in any year other than the 2020–2021 school year.</p><h4><strong>Introduction to Computer Applications (CIS*1000) </strong>&amp; <strong>Introduction to Computing (CIS*1200)</strong></h4><p>You can’t take these courses if you are in the program so uh… ignore them.</p><h4><strong>Web Design and Development (CIS*1050)</strong></h4><p>I never took this course myself but from what I have heard its simple and just teaches you the extreme basics of web design and development. Maybe consider taking it as an easy elective but honestly you might be better off avoiding it and self-teaching.</p><h4><strong>Software Design I (CIS*1250)</strong></h4><p>I really enjoyed this class. It teaches you the basics of software design and is a good first-semester course, It puts you in the right mindset. It&#39;s a pretty easy course as well.</p><h4>Introduction to Programming (CIS*1500)</h4><p>Well, you cant take this course if you take Introduction to Programming, which you are required to take… so uh… ya…</p><h4>Programming (CIS*1300)</h4><p>If you have ever programmed before you will probably find this course quite simple. It might fill in some gaps for you or clear some things up but it probably won&#39;t teach you much. The assignments are generally easy. The professors tend to try and screw students on minor spec things or style so watch out for that. You can slack off quite a bit in this class, but don&#39;t hold me to that advice. Welcome to the world of C.</p><h4><strong>Discrete Structures in Computing I (CIS*1910)</strong></h4><p>This course is hard and it sucks. It is your first theory course, you are going to hate it, wonder why it&#39;s relevant and probably not pay it much attention. Don&#39;t do that, pay attention, learn the concepts, and start to figure out how they are useful in computing, you will need them in the future. The assignments are difficult and so is the midterm and final. Go to class, practice, do your homework, research, and keep up and you should be fine.</p><h4><strong>Structure and Application of Microcomputers (CIS*2030)</strong></h4><p>A lot of people I know hated this course and struggled with it. I found it easy but complicated, mostly because I was interested in its contents. It teaches assembly and low-level computing concepts and even some hardware talk. Don&#39;t slack off in this class, it&#39;s easy to fall behind and the amount of content, assignments, and labs can be overwhelming. Study hard for the midterm and final. The professor that usually teaches the course is super nice and is open to questions, as long as they are not dumb.</p><h4><strong>User Interface Design (CIS*2170)</strong></h4><p>Extremely easy. Almost everyone I know took this course and found it easy. It introduces you to the basics of UI design and generally has some simple UI design process related team project and various tests. Definitely a good course to take early on in your degree, it introduces you to a lot of basic UI concepts that you can build off of and will use if you ever do frontend work.</p><h4><strong>Software Design II (CIS*2250)</strong></h4><p>I never took this class, its meant for the Software Engineering majors. From what I&#39;ve heard it&#39;s pretty easy, just teaches some basic concepts and generally involves a group project. Don’t take it if you are not in Software Engineering, there are far better electives you can take.</p><h4><strong>Object Oriented Programming (CIS*2430)</strong></h4><p>Not too hard of a class, introduces you to Java and basic OOP. Pay attention since these concepts will be good to know for interviews. The content isn&#39;t difficult nor are the assignments and tests. Probably don&#39;t slack off in this class though. Make sure to continue to use Java outside of this course and learn more about OOP, it will come in handy.</p><h4><strong>Intermediate Programming (CIS*2500)</strong></h4><p>Hard at first, but easy other than memory management. I despise memory management in C just because it’s a pain. This course involves a lot of that as well as basic data structures so it can be hard if you don&#39;t pay attention and start assignments early. Tests are easy though.</p><h4><strong>Data Structures (CIS*2520)</strong></h4><p>A bit of a pain, and can be difficult. It introduces you to core data structures used in everyday computing and teaches you how to implement them as well as some theory. A lot of people I know struggled in this class and it can be tough. Just keep up with the content, start the assignments early, and research if needed.</p><h4><strong>Software Systems Development and Integration (CIS*2750)</strong></h4><p><a href="https://open.spotify.com/track/7KOHzmLzRDR2mwbgQilAtj?si=3SLax1JxQzSgXswo0XuBzA">The Angel Of Death</a>. As I said earlier, this course used to be a lot worse. When I took it the drop fail rate was insane (even the years before had high rates) and the course absolutely ruined everyone in it. From a high level its just a massive software project that starts in C and usually ends in Javascript/SQL, it also almost always involves parsing something complex without regex or libraries cause that would make it too easy ;). It&#39;s much easier now but do not take it lightly. Start the assignments early, ask questions as soon as you think of them and don&#39;t shrug off the midterm and final, they are easier but study for them to boost your grade in case you get destroyed on one of the assignments. The assignments all build on each other so don&#39;t write crap code (This applies for most upper-year courses).</p><h4><strong>Discrete Structures in Computing II (CIS*2910)</strong></h4><p>If you hated the first course, you are going to hate this one. Its tough, teaches more theory, and needs a lot of focus. Study hard, pay attention in class, and don&#39;t fall behind. Again you will need the theory taught in this course in the future. YOUTUBE.</p><h4><strong>Systems Programming (CIS*3050)</strong></h4><p>I never took this course but everyone I know who took it hated it and struggled hard. If it interests you then take it, but beware.</p><h4><strong>Parallel Programming (CIS*3090)</strong></h4><p>I really wanted to take this course but never could fit it in my schedule. Everyone I know who took it enjoyed it and learned a lot of good new skills from it. It was tough from what I have heard but definitely worth taking.</p><h4><strong>Operating Systems (CIS*3110)</strong></h4><p>Personally I hated this course but its required and teaches some concepts that are good to know. It can be hard but it&#39;s manageable. Just study hard at home and be prepared to look for more online resources than usual while taking this course.</p><h4><strong>Digital Systems I (CIS*3120)</strong></h4><p>I never took it myself, everyone who I know who took it said it was extremely difficult and had a massive workload. It is essentially a sequel to Structure and Application of Microcomputers. If you liked that course and are interested in this area, take this class.</p><h4><strong>System Modeling and Simulation (CIS*3130)</strong></h4><p>A brand new course at the University. I don&#39;t know anyone whos taken it but if you are interested in the course description give it a go.</p><h4><strong>Theory of Computation (CIS*3150)</strong></h4><p>Extremely hard. Its the culmination of all the theory you have been learning and teaches advanced yet extremely useful concepts such as finite automata, NP-Completeness, and Turing machines. Some parts of the course are useless if you aren&#39;t someone who is going into research but a good chunk of it is useful for every software developer to know.</p><h4><strong>Software for Legacy Systems (CIS*3190)</strong></h4><p>Really simple and easy course. No tests just 4 assignments. Teaches you COBOL, Ada, and Fortran. Not really useful unless you plan on getting a legacy programming job (Surprisingly a lot of companies are hiring people who know these languages, they are still used a lot. So if you don&#39;t mind coding in them, it’s a valid career path.)</p><h4><strong>Computer Networks (CIS*3210)</strong></h4><p>Pretty simple and straight forward course. Content isn&#39;t that difficult and the assignments are easy. Teaches you core concepts about computer networks which can be useful in general but extremely useful if you are looking for a job in that area.</p><h4><strong>Software Design III (CIS*3250)</strong></h4><p>Same opinion for Software Design II. Don&#39;t take it unless you have too. I believe it just teaches some of the same things as the previous two courses with some new content and once again, has a group project. Never heard anyone complain about this class</p><h4><strong>Software Design IV (CIS*3260)</strong></h4><p>Refer to above.</p><h4><strong>The Analysis and Design of Computer Algorithms (CIS*3490)</strong></h4><p>Hard, sometimes boring, but useful. Algorithms are a core computing topic and this course introduces you to them as well as Time and Space complexity. Pay attention, research if you don&#39;t understand a concept and apply what you learn. The course content will help you in your career and definitely in interviews.</p><h4><strong>Database Systems and Concepts (CIS*3530)</strong></h4><p>I never took this class, but I wish I did. It teaches you the basics of Databases, what they are, and how to use them as well as some theory. I have heard it can be difficult but just talk with your peers and keep up with the content and you will be fine. This course will teach you good job skills.</p><h4><strong>Introduction to Intelligent Systems (CIS*3700)</strong></h4><p>I never took this class. If you are interested in AI you should take it. I have heard it can be difficult though.</p><h4><strong>System Analysis and Design in Applications (CIS*3750)</strong></h4><p>Very easy, just a group project course that teaches basic concepts you already know about computing, it might fill some gaps in your knowledge though.</p><h4><strong>Software Engineering (CIS*3760)</strong></h4><p>Same as above.</p><h4><strong>Cloud Computing (CIS*4010)</strong></h4><p>No tests, just 3 projects, and a pretty open group project. It teaches you the basics of cloud computing in AWS and Azure (potentially GCloud in the future) and gives you the freedom to explore in the group project. The assignments were programming/research-heavy but overall the course was easy. Definitely recommend taking it, cloud computing is massive and is still growing.</p><h4><strong>Data Science (CIS*4020)</strong></h4><p>I don&#39;t know anyone who took this course. If you are interested in data science then take it, else avoid it.</p><h4><strong>Mobile Computing (CIS*4030)</strong></h4><p>Really easy course, all it involves is 2 group projects (one programming based and one teaching based) and 20 small android exercises. It teaches you the basics of Android development and is a good course if you are interested in mobile development.</p><h4><strong>Digital Systems II (CIS*4050)</strong></h4><p>Took Digital Systems I and didn&#39;t hate your life/the course? take this one if you are still interested. It is hard from what I have heard, which is expected.</p><h4><strong>Software Reliability and Testing (CIS*4150)</strong></h4><p>Pretty easy, I recommend taking it as it can patch some holes in your knowledge of testing and reliability. Content is good and the projects/tests are easy.</p><h4><strong>Software Design V (CIS*4250)</strong></h4><p>Refer to my other notes on previous Software Design courses.</p><h4><strong>Human Computer Interaction (CIS*4300)</strong></h4><p>I recommend taking this course as well. It teaches you more about UI design and human interaction with computers/the psychology behind it. It can fill in gaps in your UI design knowledge and is fairly easy and useful. The course has a lot of content and can be overwhelming at times but nothing in the course is actually hard.</p><h4><strong>Special Topics in Information Science (CIS*4450 &amp; CIS*4500)</strong></h4><p>Technically there are 2 courses like this. They are offered in most terms and require instructor consent. What the actual course is about and who teaches it varies. I have seen game programming versions and advanced OOP versions. It is usually a testing ground for future classes and you should decide to take it based on your interest in the topic it teaches.</p><h4><strong>Computer Security Foundations (CIS*4510)</strong></h4><p>Difficult and new. If you are interested in security take it.</p><h4><strong>Introduction to Crytography (CIS*4520)</strong></h4><p>Same as above but replace the word security with Crytography</p><h4><strong>Compilers (CIS*4650)</strong></h4><p>It can be difficult, the project is annoying and weird and the content, to me at least, is irrelevant and complex. Study hard, focus on getting things done early. Youtube videos at 2x speed saved me in this class</p><h4><strong>Image Processing and Vision (CIS*4720)</strong></h4><p>I never took it, I have heard it is hard though. If you are interested in it then take it.</p><h4><strong>Computational Intelligence (CIS*4780)</strong></h4><p>Same as above.</p><h4><strong>Computer Graphics (CIS*4800)</strong></h4><p>I know a handful of people who took this course and found it difficult. It is an interesting course and if you want to get into game development or computer graphics then take it, otherwise avoid it.</p><h4><strong>Game Programming (CIS*4820)</strong></h4><p>Refer to above.</p><h4><strong>Computer Science Project (CIS*4900) &amp; Computer Science Thesis (CIS*4910)</strong></h4><p>Technically two separate courses but if you take the first one 99.9% of the time you will be taking the second one. Essentially just gives you the taste of what a masters is like while in undergrad. So if you are interested in doing a masters or want to see what research is like then take these courses.</p><h3>Conclusion? I Guess You Could Call This Section That</h3><p>So… ya. If you have made it this far congrats! This is easily the longest article I have ever written and I hope it may assist some of its readers who attend/plan on attending the University of Guelph. Before I conclude this adventure lets talk about the elephant in the room, the University of Waterloo. Now I know that there is a laundry list of schools ranked above Guelph for computer science but Waterloo is easily the best and most popular computer science/engineering school in the country.</p><p>I was accepted to both the University of Waterloo and the University of Guelph. I mainly chose Guelph as my father used to work at the university so I got free tuition, I wanted more free time to do my own things on the side and I wanted to minor in chemistry because I hate my self (and I really loved chemistry before university). From what I have seen, the University of Guelph and the University of Waterloo more or less teach the same things. I know as much as my University of Waterloo friends, except for maybe some more complex math and theory since Waterloo tends to focus more on that. I have worked with developers from both schools and generally prefer to work with University of Guelph students (my previous employers were all impressed by the quality of University of Guelph students as well). I think this is because the University of Guelph better prepares you for the industry and the students from the University of Guelph have a bigger drive to prove themselves in the industry. University of Guelph students are generally better at the more social aspects of computing from what I have seen as well. However, Waterloo 100% beats Guelph when it comes to COOP. Waterloo has the best COOP program in the country and has thousands of job postings from massive global companies, Guelphs COOP system has max 200 jobs on it per term, and they aren&#39;t always the greatest quality jobs out there. Employers tend to prefer University of Waterloo students when hiring as well just because of how well known it is. Once Guelph gets a better COOP system in place it could easily be labeled as better than Waterloo, but for the moment it&#39;s not. If you want more free time, want to explore computer science more, and don&#39;t mind putting your heart and soul into your work to achieve your goals you will prefer Guelph. If you just want a solid education that teaches you more theory and makes it easier for you to get quality jobs choose Waterloo. There were times where I personally wish I went to Waterloo, and I think I could of more easily gotten jobs if I went there for sure, but I still enjoyed my time at Guelph and ended up with a new grad position at a top 3 software company.</p><p>Ok so now that that&#39;s over, time for a proper conclusion. I hope that this “summary” of my experience a the University of Guelph and all the information I have provided can help you throughout your degree. If you have any questions or want some tutoring feel free to reach out to me. Just remember, always put your heart and soul into your development, always expand your breadth of understanding when given the chance, and always challenge yourself. “Fear lies, learn to conquer it”</p><h3>About the Author</h3><p><em>Hello! my name is Damian Sandhu-Franceschi and I am a Software Developer who graduated from the University of Guelph in April of 2020. I have been a software developer for just over a decade now (As of June 2020) and have decided to start sharing my ideas and experiences through Medium. You can contact me and learn more about me through my website </em><a href="https://damiansf.dev/"><em>https://damiansf.dev/</em></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e37dcd35affa" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building Custom Slack Bots Using Botkit]]></title>
            <link>https://medium.com/@damiansandhu11/building-custom-slack-bots-using-botkit-825fb4a6f3c7?source=rss-79c00aeb5775------2</link>
            <guid isPermaLink="false">https://medium.com/p/825fb4a6f3c7</guid>
            <category><![CDATA[localtunnel]]></category>
            <category><![CDATA[npm]]></category>
            <category><![CDATA[slack]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[botkit]]></category>
            <dc:creator><![CDATA[Damian Sandhu-Franceschi]]></dc:creator>
            <pubDate>Wed, 25 Dec 2019 07:09:45 GMT</pubDate>
            <atom:updated>2020-06-09T00:23:07.443Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*G8dS0ujypSSAZaP7ZHIeoA.jpeg" /></figure><p>I recently completed a University course in which the software development component focused on designing and building Slack Bots. The main tool to do this that we were introduced to was Botkit.</p><p>Botkit seemed simple at a glance, however, I initially struggled to create a simple bot with it and couldn’t find many tutorials online (that were not ancient) so I decided to write one.</p><p>This article will walk you through utilizing a bot template I created to make your first bot. I will be using Botkit version 0.7.5 in this tutorial rather than version 4.x.x. Botkit version 4.x.x overhauls Botkit and has given me a plethora of problems in the past. Due to this, I will not be using it, they still update the 0.X.X version and it does pretty much everything version 4.x.x does.</p><p>Here is the link to my template that we will be using in this tutorial:</p><p><a href="https://github.com/damiansf/Bot-Template">damiansf/Bot-Template</a></p><h3>Setting up the bot on Slack’s API website</h3><p>To Begin, we shall start with some setup on the Slack side of things. I&#39;m assuming that you, the reader, have a Slack Workspace setup for this tutorial, if not<strong> please set one up now</strong>.</p><p>Navigate to the Slack API website (<a href="https://api.slack.com/">https://api.slack.com/</a>) and go to the “Your Apps” section. Once on this page click on “Create New App”, enter whatever name you want for this app and select your Workspace.</p><p>And BOOM! the app has been created, this part of the tutorial is done! Kidding…</p><p>A few simple things need to be modified in our new bots configuration. First off, go to the “OAuth &amp; Permissions” page and add “bot” and “commands” Oath Scopes under “Scopes” by clicking “Add an Oath Scope”. Next up, navigate to the “Bot Users” page and click “Add a Bot User”, name the user whatever you want and flick the “Always Show My Bot as Online” switch (optional).</p><p>Once you have completed the above go back to the “OAuth &amp; Permissions” page and click “Install App to Workspace”, this will install the bot and you should now be able to interact with it on Slack (note, you’ll need to redo this every time you add new Permissions/Scopes to the bot).</p><p>We now have 2 more things to do on this website for our initial setup. First off, scroll down to the “Redirect URLs” section of the “OAuth &amp; Permissions” page and select “Add New Redirect URL”. This URL will be used to redirect your app when you install it through your locally hosted instance later on. As I will explain later I use localtunnel in this tutorial to expose the bot publicly, but really you can use anything to do this, you could even host the bot on a server if you want to. For now, I will assume you are also using localtunnel so the URL you enter will look like this: <a href="https://bot-template.localtunnel.me/oauth">https://YOURSUBDOMAIN.localtunnel.me/oauth</a></p><p>Pick any subdomain you want and jot it down for future use. Once you have entered this URL be sure to save it.</p><p>The final thing we need to do will assist us later in the tutorial and involves going to the “Slash Commands” page. Once on this page click “Create New Command” and enter “/helpme” as the command. Put in whatever description and hint you want, it doesn&#39;t matter, and fill out the Request URL with this:</p><p><a href="http://bot-template.localtunnel.me/slack/receive">http://YOURSUBDOMAIN.localtunnel.me/slack/receive</a></p><p><em>Side note, the reason this URL is http and not https is that at the time of writing this article the localtunnel certificate has expired and the developer has not regenerated it yet (ref </em><a href="https://github.com/localtunnel/localtunnel/issues/332"><em>https://github.com/localtunnel/localtunnel/issues/332</em></a><em>). Once this issue is resolved you can use https here, if you’re not using localtunnel go ahead and use https.</em></p><p>Click save and Boom, you have created your first slash command (on the Slack side of things that is) and have finished the Slack side setup for the Bot. Keep the window with this website open as we will need information from it later on.</p><h3>Integrating the template repository with the Slack Bot</h3><p>Moving on from the Slack side of things, we are finally going to use the template, so go ahead and clone it from here:</p><p><a href="https://github.com/damiansf/Bot-Template">damiansf/Bot-Template</a></p><p>Open up the repository in your favorite text editor and navigate to the .env file.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GZRIiBPzcBYwcdH9D6MKYw.png" /></figure><p>The file contains a bunch of variables that you need to fill in with information from the Slack API website. The file explains where to get all of the values in detail, but just to restate, you can find them all on the “Basic Information” page under “App Credentials” with the exception of the “BOT_TOKEN” which can be found on the “OAuth &amp; Permissions” page under “OAuth Tokens &amp; Redirect URLs -&gt; Tokens for Your Workspace -&gt; Bot User OAuth Access Token”.</p><p>Once you have copied all these values over you are ready to move onto the next step.</p><h3>Running and using the Bot</h3><p>Use yarn or npm to install the dependencies for the bot.</p><p>Next up (if you are using localtunnel) run (in a terminal window):</p><p>lt — port 8765 — subdomain YOURSUBDOMAIN -h <a href="http://localtunnel.me/">http://localtunnel.me</a> — local-https false</p><p><em>Side note, the “-h </em><a href="http://localtunnel.me/"><em>http://localtunnel.me</em></a><em> — local-https false” is needed due to the localtunnel issue I mentioned earlier. Once the issue is resolved you can remove it.</em></p><p>If you are not using localtunnel just make sure the bot is available publicly through port 8765 (or whatever port you set in the .env file).</p><p>Next, run “node .” (in a separate terminal window) to spin up the bot and go to <a href="http://YOURSUBDOMAIN.localtunnel.me/login">http://YOURSUBDOMAIN.localtunnel.me/login</a> and install the bot. Really you only need to do this step once, or as I stated before if you change the bot permissions/scope. You might notice that line 16 of the index.js file restates the scopes that we gave the bot earlier. Make sure the scopes listed here always line up with the scopes the bot has on the Slack API website. When adding new permissions/scopes, add them through Slack’s API website, add them to the scope array in the index.js file, and reinstall the bot either through the Slack API website or through the login URL as we did above.</p><p>Once you have completed the above you should be able to message the bot “help” and get a response. You should also be able to add the bot to a channel and use the “/helpme” command and get a response.</p><p>And just like that, the bot is up and running and you can talk to it! in the next few sections I will explain the inner workings of the template and some ways you can expand it.</p><h3>Explaining the template</h3><p>It’s finally time to explain what the hell the template is and what it actually does. We will start with the index.js file:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ufaIp46EHteLroNLXxwuHA.png" /></figure><p>The file is fairly simple overall and is fairly self-explanatory. All it does is set up the Bot and the Bot Controller using the values in the .env file. One thing that I will make special note of is line 7 where a json_file_store is specified. This is a basic storage system that is set up and can be interacted with through the Bot Controller. This store’s data in JSON files in the local file system. Line 36 calls a setup function from the bot.js file which I will explain next:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LORwII3fJ599QvJ4u7mRPw.png" /></figure><p>This file contains our actual bot. It defines how the bot will respond to the slash command we setup as well as how it will respond to a direct message. Line 5 states that if the bot hears help via a direct message respond with the message “This is a help message that I have sent to you via Direct Messaging”. Line 12, on the other hand, is a general handler for slash commands and utilizes a switch statement to handle different slash commands.</p><p>On line 20 a block of code begins that is super useless but is there to show how to add, find and remove data from the controllers JSON storage that was set up in the index.js file. The storage setup creates three folders that have JSON files with data in them. These folders are:</p><ol><li>Channels</li><li>Teams</li><li>Users</li></ol><p>The Teams file is updated by Botkit when requests come in. Personally I stick to the Users folder and use the JSON file within it to perform all basic storage tasks.</p><p>The final file we will discuss is the index.test.js file (which I&#39;m not going to insert a screenshot of since it&#39;s pretty long and simple if you know how Jest works). The template comes with base-level tests that you can analyze and learn from. They can be run by typing into the terminal “npm run test”. These tests are nothing special really, they just check the response from the slash command and direct message handlers in various scenarios. The interesting bit of code starts on line 11. The code in this beforeAll section uses BotkitMock and BotBuilderAdapterSlack to set up a mock instance of the bot which allows us to test the bot without actually spinning it up. The setup is fairly simple and intuitive.</p><p>That more or less explains the template. It really is just a simple template for a simple bot that aims to just give you a running start when it comes to writing Slack Bots using Botkit.</p><h3>Expanding the template</h3><p>Obviously most of you will want to expand this template, so I thought id write this section to nudge you in the right direction.</p><p>The first major thing someone might want to add is an actual database for the Bot. Botkit actually has a fairly seamless integration with MongoDB that is expanded upon with this library:</p><p><a href="https://github.com/howdyai/botkit-storage-mongo">howdyai/botkit-storage-mongo</a></p><p>The above repo explains how to use the library in more detail.</p><p>I have also provided a link at the bottom of the article (and right here cause why not: <a href="https://botkit.ai/docs/v0/core.html">https://botkit.ai/docs/v0/core.html</a>) to the Botkit version 0.X.X docs which have their own section on Slack functionality. You can implement more complex commands, interactive commands, Dialogs, etc… Using the code in the template as a baseline and the information provided in this article, the docs should make much more sense to you and should simplify more complex implementations. In general, anything you implement with Botkit in code has a corresponding component that needs to be set up on the Slack API website.</p><h3>Conclusion</h3><p>And we&#39;re done! the base bot is set up and running and you can expand upon it as you wish! Feel free to contact me through my website <a href="https://damiansf.dev/">https://damiansf.dev/</a> if you have any questions.</p><p>Happy Hacking!</p><h3>Resources</h3><ol><li>Template Repository: <a href="https://github.com/damiansf/Bot-Template">https://github.com/damiansf/Bot-Template</a></li><li>Botkit Docs: <a href="https://botkit.ai/docs/v0/core.html">https://botkit.ai/docs/v0/core.html</a></li><li>Botkit Mongo DB storage adapter: <a href="https://github.com/howdyai/botkit-storage-mongo">https://github.com/howdyai/botkit-storage-mongo</a></li><li>Botkit Repository: <a href="https://github.com/howdyai/botkit">https://github.com/howdyai/botkit</a></li><li>Botkit Website: <a href="https://botkit.ai/">https://botkit.ai/</a></li><li>DotEnv Repository: <a href="https://github.com/motdotla/dotenv">https://github.com/motdotla/dotenv</a></li><li>Localtunnel Website: <a href="https://localtunnel.github.io/www/">https://localtunnel.github.io/www/</a></li><li>Localtunnel Repository: <a href="https://github.com/localtunnel/localtunnel">https://github.com/localtunnel/localtunnel</a></li><li>Botkit Mock Repository: <a href="https://github.com/gratifyguy/botkit-mock">https://github.com/gratifyguy/botkit-mock</a></li></ol><h3>About the Author</h3><p><em>Hello! my name is Damian Sandhu-Franceschi and I am a Software Developer who graduated from the University of Guelph in April of 2020. I have been a software developer for just over a decade now (As of June 2020) and have decided to start sharing my ideas and experiences through Medium. You can contact me and learn more about me through my website </em><a href="https://damiansf.dev/"><em>https://damiansf.dev/</em></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=825fb4a6f3c7" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Using Docker, Node and Express to Create a “Mock” Backend]]></title>
            <link>https://medium.com/@damiansandhu11/using-docker-node-and-express-to-create-a-mock-backend-76045b4bb65?source=rss-79c00aeb5775------2</link>
            <guid isPermaLink="false">https://medium.com/p/76045b4bb65</guid>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[back-end-development]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[express]]></category>
            <dc:creator><![CDATA[Damian Sandhu-Franceschi]]></dc:creator>
            <pubDate>Sat, 07 Dec 2019 20:37:49 GMT</pubDate>
            <atom:updated>2020-06-09T00:23:22.076Z</atom:updated>
            <content:encoded><![CDATA[<h3>Using Docker, Node, and Express to Create a “Mock” Backend for Frontend Development</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mN5D37ovj2eoadzf7ONkIQ.jpeg" /></figure><p>I used to work for a company where a common problem we encountered was that our frontend development-related stories would continuously be pushed to later sprints. The main reason behind this was that the required backend features wouldn’t get finished until the end of the sprint, leaving no time to implement the frontend changes.</p><p>A simple fix for this was to just not bring frontend stories into the sprint unless the backend features that were required had already been completed. This worked in terms of solving our “burn down charts look terrible” problem but it resulted in us using Postman to demo the Backend to stakeholders (who generally prefer to see a shiny, fancy UI).</p><p>How could we work on the Frontend and Backend at the same time? mock the Backend features we needed of course!</p><p>The solution we settled on was to use Docker and Express to create a mock Backend that would be deployed in our servers and development environments and would spit back hardcoded JSON responses that perfectly matched the response format of the actual, to be implemented, Backend.</p><p>This allowed for the Frontend to call this mock service for data/to make requests as if it were calling the actual backend. Once the actual backend implementation was finished the only change required was a simple URL swap.</p><p>I have created a generic template for this mock Backend and use it in most Frontend projects I work on so I thought it might be worth sharing.</p><p>The full source code for my template is available here, the README details how to actually get the thing up and running: <a href="https://github.com/damiansf/MockBackendTemplate">https://github.com/damiansf/MockBackendTemplate</a></p><p>Most of the template is fairly standard (the Dockerfile, package.json, etc…) the main file of interest is the mock.js file.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/bb00be0f020bbb88495654c01cfbffc3/href">https://medium.com/media/bb00be0f020bbb88495654c01cfbffc3/href</a></iframe><p>In the above snippet, the server is set up and a bit of code is written to respond to get requests sent to /DoStuff. The repository has a folder called jsonFiles that is used to store files that contain responses for each request. The /DoStuff request returns a simple response with some “data” just as a sample.</p><p>This code is easily extendable and can do anything (Post requests, Delete requests, whatever you want!).</p><p>Feel free to clone my repository and use it for your own projects. If you have any questions contact me through my website <a href="http://www.damiansf.dev">www.damiansf.dev</a></p><h3>About the Author</h3><p><em>Hello! my name is Damian Sandhu-Franceschi and I am a Software Developer who graduated from the University of Guelph in April of 2020. I have been a software developer for just over a decade now (As of June 2020) and have decided to start sharing my ideas and experiences through Medium. You can contact me and learn more about me through my website </em><a href="https://damiansf.dev/"><em>https://damiansf.dev/</em></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=76045b4bb65" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>