My AltSchool journey
Published: 2022-06-28 00:17:00


**Month 1**

  During my first week, I learned how to use the calendar and email app effectively and how to set up events using a google calendar.

I also learned some of the best practices to consider when writing  emails (adding signatures, text formatting, how to archive or label your emails for easy identification etc...) and using Carbon copy (cc) and Blind carbon copy (bcc) when sending emails.

I was then introduced to the learning management system (LMS) where i watched videos on how to navigate and make the best out of the LMS. There we had a walkthrough of what we’ll be doing throughout the year.

Below are some very important points to keep in mind as we progress on our journey to become world class software engineers.

- We’ll be grouped into learning circles during our second month at the school, our learning circles will serve as an accountability group where we help and motivate each other as we progress. Leads and co-lead will be randomly assigned and the circles will be rotated after some time.

- Each circle is expected to have a group study session at least once a week.

- Classes will be held twice a week to breakdown the concepts that were taught on the LMS.

- Town hall meetings will be held once a month and attendance is compulsory.

- Students progress will be tracked, a document with the ratings (green, yellow and red) will be shared to show your progress, if your rating is red you have three weeks to work towards having a yellow/green else you will be placed on probation. Been on probation for three weeks will lead to elimination from the program.

- Exams will be written as coding exercises at the end of each month, which is 40% of your final grade, weekly assessment, quiz and attendance is 60%.


**In the course of the second week**, I learned the basics of computer science, below are notes from my understanding of the concepts.

**What is computer science?**
Computer science is a broad field, it involves all aspects of computing, ranging from problem solving to the process that goes into solving those problems. Computer science is all about problem solving, it teaches students to create new technologies and not just learn how to use them. 

In a more technical term, it refers to the study of computers, its principles, hardware and software designs and how they impact society at large.

**Some of the fields of computer science include:**

- Artificial intelligence (the design of systems which can perform computations without human control)
- UI/UX
- Data science etc…

**SOFTWARE ENGINEERING:** is a branch of computer science in which the principles of computer science are applied in order to develop softwares.


**what are software and hardware:**

Hardware from the definition we are used to, refers to those components of a computer system that you can see, touch and interact with.

while

Software are the components of the computer that you cannot physically touch, however you can interact with them. These components perform computations or actions by following a series or sets of commands given to them. Example includes: Operating systems, facebook, Adobe photoshop etc…

Software is classified into **system software** and **application software**.

These two works hand in hand in order for a computer to function, without system software however, application software cannot be run successfully.

**System software** is the software that acts as an intermediary between the computer and user, this software is programmed to access and control how the computer hardware works.
An example of system software is your Operating system.

**Application software** helps users perform specific operations ranging from sending a message, playing a video etc, depending on what the application is programed to do, the application software aids the user to perform tasks.

These are some of the major concepts i learned during the second week.

**During my third Week**, after learning the basics of computer science, i was then introduced to some of the basics concepts of programming, below are some of the concepts that were taught.

**What is programming?**
  Programming is the process of telling a computer what to do and getting it to solve problems. it is the act of giving well structured instructions to a computer to run or execute

**Programming languages**
  Just like human language, we can use different languages to give instructions to a computer, however a computer only understand one language called <u>machine language</u>, this language is made of bits(binary digits) which are zero's and one's.

There are two types of computer language

**High level language**:- This languages are more understandable and human readable, it is translated by translators (compilers and interpreters) to machine language which is the language a computer can understand directly.

**Low Level Language:-**  is the language that a computer can directly understand, the processor is able to run low level languages without using translators, and that makes low level programming faster, however it is not human readable and easy to understand like other high level languages. 

Low level languages are also subdivided into: **Machine and Assembly language.**

**Machine language** is the language a computer can understand without having to use a translator. These languages are written in bits (0’s and 1‘s) and hexadecimals.

**Assembly language** is also a low level language but it is designed for specific processors, this language represents instructions in a bit more human readable and understandable way. Assembly language uses an assembler to convert codes to machine language.


**DATA AND INFORMATION:**
  Data’s are group values that does not have meaning, this values can be a letter, group of letters, numbers etc. Example of values can be a list of dates, names of people, adresses etc

Data’s are of 2 types:

**Analog & Digital:** Analog data is data that can be represented physically eg sound, while digital data is used to model other types of physical data using machine dependent language.


**Information** is the result gotten when data's are processed, this results can then be use to make decisions.  

**BITS & BYTES**
Bits which means binary digits are represented as 0 and 1.
Because using just 0's and 1;s can be very limiting, this 0's and 1's are grouped together to represent any data or information in a computer system.

A group of 8bits is called a byte, and a nibble is a group of 4 bits.

Bits is denoted with a small letter b.

Bytes is denoted with a capital letter B.

1024B = 1kB
1024kB = 1mB
1024mB = 1gB


Bits are mostly used in measuring/describing network speed, while bytes are used in measuring the size of data on a computer.

In the example below, you can see how to measure the time taken to finish downloading a 200mB of file with a network speed of 200mb/s:

```
1bit = 0.125 (since 8bit = 1byte, 1bit = ⅛ = 0.125)

//Converting 200megabits to a megabyte first

1     =  0.125
200   =  x

X = 200 * 0.125 = 25mB

T = 200/25
T = 8s
```

So 200mB / 25mB is the time it would take to complete the download
T = 8secs, (it will take 8sec to download a 200mB file size with a network speed of 200mb, well except you are using Glo lol)



**VARIABLES & DATA TYPES**

Variable is a way labeling data, a variable is like a container for holding a value, this value can be anything from a string, number, array etc.

Having value stored in a variable will save you from having to write it over and over again and the stress to remember it, imaging having to remember a value: 98765434567, you can just give it a name: let x = 98765434567 and each time you need to use it, you call the variable with the name x.

**Data types** specifies which type of value a variable holds, some of data types we have are: string, numbers, Boolean, arrays etc. Defining a data type creates or gives you the ability to use specific set of operations on that data, for example using subtraction, multiplication, division on numbers.


**DATA STRUCTURES**
  Data structures is a way of organizing data in a specific way to be able to access and use them efficiently. We have linear and non linear data structures. Some examples of data structures includes:

Linked List : is a linear data structure where items are placed in such a way that they are connected to each other, gaining access to an item means having access to the item before it, data cannot be randomly accessed from anywhere in a linear data structure but rather moving step by step from the first data to the next and eventually the last. 

Each item in a linked list is called a node, and the node contains a pointer which points to the next node.

Hash Table: Hash table is a non-linear data structure, here data's are stored in a key value pair, each value has a unique key as integer in a hash table. This integers are created by hash functions, so no key is ever the same, this hash functions are used in cryptography, security etc…

Other examples of data structures include, Arrays, objects, stack, queue etc.


**CONTROL FLOW**
  This is the order in which a program runs, by default it is sequential(top to bottom)

- sequential: starts from the top in the order in whch it was written
- Conditional: this is using a bunch of if else statements
- Loops: running an operation over and over again untill a condition is met.

**What is recursion?**
 An algorithm/function that calls itself until a base condition is met, most problem solved with recursion can also be solved with loops and recursion has no performance benefit over loops but it make our code look clean.


**BIG O NOTATION**
Big o is the measure of how well an algorithm can perform, it is also known as time complexity which is the measure of how long it takes an algorithm to complete running, but big o doesn’t just measure time taken, it  analyses the efficiency and scalability of an algorithm and how much time and space the algorithm consumes (Time and space complexity).

Big o measures the worst case-scenario of an algorithm.

Some common big o complexities are: 
**0(1):** This means constant time, no matter the size of your input the algorithm will use the same of amount of time to complete running. Example is when we try to access an item in an array, no matter the size of your array or what array index you are getting the item from, the algorithm is performing one operation and takes up the same time always.

**o(n):** in this case, time taken to complete an operation increase with respect to the size of the input given, an example is reading a book with n pages, or looping through an array to get the  last item, if the array length is 4 it takes less time to complete than when the array length is 400000.

**o(log-n):** in this case, as the input increases the time taken to complete the operation increases but this time slowly. So 0(log-n) is more efficient than o(n). Example of this algorithm is a binary search algorithm.

**0(n*2):** This is the most slowest complexity an algorithm can have and can be seen when accessing an array inside of an array. 

I also learned about the different operating systems, programming paradigms and algorithms.

I hope to learn more from the school and share my updates with you.