INF2050
Welcome to INF2050, Software development tools and practices
Learning goals
In this course you will learn how to adhere to modern software development guidelines that predict project success. You will learn how to set up and configure tools that ensure a clean and reliable codebase, and you will gain practical experience on how to develop with style in a software developer team.
Success
This is one of the most valuable courses to guarantee a smooth entry into the tech job market.
Requirements
You can only participate in this course if you attended and passed the following two courses:
- INF1070, Usage and administration of computer systems
- INF1070 covers basics of networking, security, software setup and network protocols, all of which are required for INF2050.
- INF1120, Programming I
- You will be programming in a team of students, your individual contribution and code quality will be a primary grading criteria. Basic proficiency with Java is required for INF2050.
Warning
It is not possible to acquire the preliminary requirements while you take INF2050. You will not have the time to recap the basics thouroughout this course. Unless you have already passed the preliminaries, you cannot take INF2050.
Useful, but not mandatory courses are:
- INF3135, Software construction and maintenance
- INF5151, Software Engineering: Analysis & modelling
- INF5153, Software Engineering: Conception
Commitment
This course requires weekly lab work and extracurricular contribution to a group project.
You are expected to:
- Attend all lectures
- Come prepared
- Attend all lab units, autonomously solve all lab units
- Consistently contribute to your team project
- Pass the exam
Learning
We can provide you with the best possible conditions to learn, but we cannot learn for you. Learning is alsways active, never passive. The more active you are, the better you'll score in the exams.
Group work
- Part of your coursework will be your contribution to a continuous group project. Team size will be 3 students.
- You will be coding a simple turn based game in java, as a terminal interface application.
- There will be only no network functionality involved, and the interest of this course is not web-app development.
- There will be no advanced graphical UI involved in this course, as the interest is not GUI programming.
- You will receive feedback on how well your submission reflects the best-practices and tools presented in class and trained in lab units.
- The feedback grade is "virtual", i.e. it does not count to your final grade.
Lectures and notes
The lectures will be a mix of incomplete orientation slides and live programming demos.
Notes
It is your responsibility to take personal notes. No pencil, no career.
Software
You will need the following software to participate in lab work.
Warning
The official lab computers have all requirements installed, but it you want to use your own computer, it is your responsibility to ensure all software installed before attending lab units:
List:
- Java, JDK-23, Oracle version
- Test your VM installation with
java -version. You must use version 23. - Test your compiler installation with
javac HelloWorld.java.
- Test your VM installation with
- Maven
- Test your maven installation with
mvn -version. It must show the maven home location.
- Test your maven installation with
Use SdkMan
SdkMan (SDK Manager) is the simplest way to set up java and maven. Use it: sdkman.io
- Git
- Test your git installation with
git init.
- Test your git installation with
- IntelliJ Ultimate
- Request a free educational license, you must use the Ultimate version for this course.
Avoid Windows
If you're using a Windows computer, I strongly recommend to install Linux for this course. You'll be working a lot with UNIX commands, and the learning experience will be a lot easier on a UNIX like system (Mac OS / Linux).
Evaluation criteria
See course plan.
Exams
Exams will take place in person during the scheduled time. No documents or electronic devices are allowed during the exam, except for a hand-written US-letter sized sheet of paper (two sided).
- Midterm: March 1st
- Final: May 3rd
Exam absence
- Re-taking an exam due to absence is only allows in exception cases, and needs to be well justified.
- Acceptable reasons are for example: decease of a family member, hospitalization, accident, etc...)
- For more information, see department guidelines.
Passing
- You need to score at least 60% in the exams (total combined).
- There is no other evaluation criteria, it is not possible to gain extra points after grading.
Teaching staff
Communication
Please respect the following communication netiquette (you are many, we are few).
Course material
- If you have questions concerning the course material, please do not send me an email or direct message - post on the Mattermost chanel instead.
- The channel is only accessible upon invitation - please follow the instructions (received by email) to join the channel.
- Note that the channel has strict communication rules and non-respect can lead to your removal from the channel.
Grades
- You can contact me by direct message (email / mattermost) if you discovered a formal grading-mistake.
- Examples:
- A miscalculation, i.e. the points on your exam sheet do not add up.
- You participated in the exam, submitted a sheet, but did not receive a grade.
When not to contact the prof
- Grading criteria are not negotiable:
- I cannot change your grade based on your desire or needs to receive a better grade:
- "I will fail this class if you don't give me extra points."
- "I only need X more points to receive a better grade."
- "I will lose my scholarship if you do not give me extra points."
- I cannot change your grade based on your efforts:
- "I put in X amount of hours, and I am deceived with my grade."
- I cannot change the grading criteria:
- "If you changed the grading criteria from y to z, I would receive a better grade."
- I cannot change your grade based on your desire or needs to receive a better grade:
Double check before reaching out
I cannot change your grade or the grading criteria, based on your efforts, desire, or needs.
Mentoring
- The computer science department offers a free mentoring service, which is primarily intended for computer science
bachelor students.
- The mentoring program is mainly meant for early courses INF1070, INF1120, INF1132, INF2120 and INF2171.
- Depending on the mentors skills, support for other courses, including this one, might be available.
- For more information, visit https://info.uqam.ca/aide
Use of Generative AI Tools
The use of generative AI tools in graded submissions (code, reports, exams) is strictly and formally prohibited. Various detection tools will be used.
Detection of any generative AI tool is considered an attempt at plagiarism.
Material
This course is practice-heavy, i.e. there will be live-coding examples in every lecture.
Warning
The live coding sessions are mere demonstrations, where you can learn about conceptual possibilities. It is absolutely vital that you gain practical proficiency with the concepts seen in class by attending and solving the lab exercises.
No slides
There will be no slides for this course. All information is communicated via this website.
- Class attendance is not optional.
- Plenty of information and illustrative examples will be shown exclusively in class.
- You are expected to decide yourself what is relevant, and take additional notes.
PDF version
You can download the course material as PDF book using this link.
Note: The link is currently under maintenance, there are some issues with diagram rendering in the PDF version.
Regularly check for updates
By nature, the PDF version is a static snapshot and will not automatically update on your machine when new content or corrections are added to the web version. It is your resposibility to regularly verify you're working with the most recent version.
Finding content
- In this course you are required to abstract and combine knowledge across course units.
- To ease the task of finding samples and definitions, this page is fully indexed.
Use the search function
Use the search function in the top right to rapidly navigate the course material.
Gaming
- Throughout your TPs, you'll be implementing the card game Skyjo ( and later some extensions).
- Skyjo is a short and fun card game, yet its game mechanisms are complex enough to allow for some serious software modelling and design.
- The best preparation for coding (or designing) any software project, is understanding the requirements, therefore I
invite you to play the game regularly with your team members.
Two copies of the game can be temporarily borrowed at my office.
The rules are available as PDF, here.
Basic rules
- Skyjo is a card game, with a deck of cards ranging from
-2to12.- Cards are not unique, there are multiple
-2, multiple-1, etc... - The numbers on a card are the amount of points a card counts.
- Cards are not unique, there are multiple
- The goal for winning Skyjo is to mark as little points as possible.
- After every session, points are added to each player's balance.
- The game is repeated as many sessions as it takes for a player to exceed 100 points.
- The winner is the player with the least points at game end.
Skyjo sessions
-
The game has two piles:
- A hidden card pile
- A discarded card pile (open)
-
Each player starts with a
4 x 3matrix of cards:

-
Throughout their turns, each player gradually reveals or replaces their cards:

-
The sessions ends when the first player has all cards revealed. Each player then counts their total by summing up their revealed cards:

Image credit: BoardGamesGeek.com
A little twist
If the player who ended a session does not have the lowers count, their count is doubled (as penalty).
Skyjo turns
- Obviously the game would be kind of boring if the only action ever allowed were to reveal a card.
- When it's a player's turn they can choose exactly one of two possible actions:
- Take the topmost discarded card: The player replaces any of their cards (regardless if revealed or hidden) by the card taken from the discard pile. They are not allowed to peek under the hidden cards before making a choice. The replaced card is placed publicly on the discard pile.
- Take the topmost hidden card: The player reveals the new card and then decides, whether...
- ...they reject the card: Card is placed on the discarded cards pile, but the player must reveal one of their remaining hidden cards.
- ...they accept the card: They replace one of the cards, following the same mechanism as if the card they had taken a card from the discard pile.
Special action
There a special rule which possibly applies at the end of each turn: If a player has 3 times the same card in a column, they can eliminate the column altogether.
- This is optional, and does not count as a dedicated action.
- Afterwards, the player has one less column.
Technically the special action can be triggered repeatedly, leading to an entirely empty matrix.
Java compiler recap
In the remainder of this first lecture, we recapitulate basic concepts of the Java programming language, notably the path from source code to a successful code execution.
Executing code
There are two ways to execute code. Which path is taken depends on the programming language.
- Using an interpreter: The computer tries to make sense of your source code, as it processes it, line by line. Examples:
- Python
- Bash
- Javascript
- Using a compiler: The computer does not make sense of your source code, but expects you to translate it first into bytecode, using a compiler. Examples:
- Basic
- C/C++
- Java ???
About binaries
Usually, compiled code is bound to a specific target platform. That is, once a compiler has translated from source code to byte code, the outcome can only be used on specific hardware.
Interpreted VS compiled languages
So which one is better ?
- Interpreted languages:
- Cross-platform compatibility
- Slightly faster development, no need to wait for compiler
- Often "easier" syntax, beginner friendly
- Compiled languages:
- More performant: compiler optimizations for target platform, executed in native code
- Safer: Fewer runtime errors, more compile time errors
Note, that a compiler only needs to its job once, VS an interpreter needs to run every time a program is executed.
And what about Java ?
Java is a special case...
- Java is a compiled language
- Java bytecode works on every platform, because it is interpreted by a virtual machine, the JVM.
- Java unites some advantages of both:
- Cross-platform compatibility
- Performant compiler optimizations for VM
- Security by compiler checks
Java compiler illustration
Step 1: Write java code
A human developer writes human-readable java code:
class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Step 2: Compile to java bytecode
The java compiler is called: javac HelloWorld.java and produces bytecode:
CAFE BABE 0000 0042 001D 0A00 0200 0307 0004 0C00 0500 0601 0010 6A61 7661
2F6C 616E 672F 4F62 6A65 6374 0100 063C 696E 6974 3E01 0003 2829 5609 0008
0009 0700 0A0C 000B 000C 0100 106A 6176 612F 6C61 6E67 2F53 7973 7465 6D01
0003 6F75 7401 0015 4C6A 6176 612F 696F 2F50 7269 6E74 5374 7265 616D 3B08
000E 0100 0D48 656C 6C6F 2C20 576F 726C 6421 0A00 1000 1107 0012 0C00 1300
1401 0013 6A61 7661 2F69 6F2F 5072 696E 7453 7472 6561 6D01 0007 7072 696E
746C 6E01 0015 284C 6A61 7661 2F6C 616E 672F 5374 7269 6E67 3B29 5607 0016
0100 0A48 656C 6C6F 576F 726C 6401 0004 436F 6465 0100 0F4C 696E 654E 756D
6265 7254 6162 6C65 0100 046D 6169 6E01 0016 285B 4C6A 6176 612F 6C61 6E67
2F53 7472 696E 673B 2956 0100 0A53 6F75 7263 6546 696C 6501 000F 4865 6C6C
6F57 6F72 6C64 2E6A 6176 6100 2000 1500 0200 0000 0000 0200 0000 0500 0600
0100 1700 0000 1D00 0100 0100 0000 052A B700 01B1 0000 0001 0018 0000 0006
0001 0000 0001 0009 0019 001A 0001 0017 0000 0025 0002 0001 0000 0009 B200
0712 0DB6 000F B100 0000 0100 1800 0000 0A00 0200 0000 0300 0800 0400 0100
1B00 0000 0200 1C
(Hex dump produced with: xxd -u -p HelloWorld.class | sed 's/..../& /g')
Do you see something unusual ?
The hex-dump of java bytecode shows that every compiled class starts with CAFEBABE. Apparently an easter egg, added by the java developers.
Step 3: Run byte code on JVM
Finally, the byte code is distributed to various target systems.
- Note that any system needs a JVM to run java bytecode.
- Other compiled languages do not have this requirement, as they directly produce CPU-executable code.
How is the JVM best described?
The JVM is an intpreter. It reads in java bytecode and immediately sends execution instructions to the host in the CPU's native machine language.