Skip to content

Commit b35b1f2

Browse files
author
Kirill
authored
Update common software development questions (bregman-arie#342)
* Update README.md * Update README.md
1 parent c664d2e commit b35b1f2

File tree

1 file changed

+55
-10
lines changed

1 file changed

+55
-10
lines changed

topics/software_development/README.md

Lines changed: 55 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141

4242
<details>
4343
<summary>What programming language do you prefer to use for DevOps related tasks? Why specifically this one?</summary><br><b>
44+
45+
For example, Python. It's multipurpose, easy-to-learn, continuously-evolving, and open-source. And it's very popular today
4446
</b></details>
4547

4648
<details>
@@ -60,18 +62,30 @@ Statements are instructions executed by the interpreter like variable assignment
6062

6163
<details>
6264
<summary>What is Object Oriented Programming? Why is it important?</summary><br><b>
65+
66+
[educative.io](https://www.educative.io/blog/object-oriented-programming) "Object-Oriented Programming (OOP) is a programming paradigm in computer science that relies on the concept of classes and objects. It is used to structure a software program into simple, reusable pieces of code blueprints (usually called classes), which are used to create individual instances of objects."
67+
68+
OOP is the mainstream paradigm today. Most of the big services are wrote with OOP
6369
</b></details>
6470

6571
<details>
6672
<summary>Explain Composition</summary><br><b>
67-
</b></details>
6873

69-
<details>
70-
<summary>What is a compiler?</summary><br><b>
74+
Composition - ability to build a complex object from other objects
7175
</b></details>
7276

7377
<details>
74-
<summary>What is an interpreter?</summary><br><b>
78+
<summary>What is a compiler and interpreter?</summary><br><b>
79+
80+
[bzfar.org](https://www.bzfar.org/publ/algorithms_programming/programming_languages/translators_compiler_vs_interpetator/42-1-0-50)
81+
82+
Compiler:
83+
84+
"A compiler is a translator used to convert high-level programming language to low-level programming language. It converts the whole program in one session and reports errors detected after the conversion. Compiler takes time to do its work as it translates high-level code to lower-level code all at once and then saves it to memory."
85+
86+
Interpreter:
87+
88+
"Just like a compiler, is a translator used to convert high-level programming language to low-level programming language. It converts the program line by line and reports errors detected at once, while doing the conversion. With this, it is easier to detect errors than in a compiler."
7589
</b></details>
7690

7791
<details>
@@ -84,35 +98,52 @@ SOLID design principles are about:
8498

8599
SOLID is:
86100

87-
* Single Responsibility - A class should only have a single responsibility
88-
* Open-Closed - An entity should be open for extension, but closed for modification. What this practically means is that you should extend functionality by adding a new code and not by modifying it. Your system should be separated into components so it can be easily extended without breaking everything.
101+
* Single Responsibility - A class* should have one ~responsibility~ reason to change. It was edited by Robert Martin due to wrong understanding of principle
102+
* Open-Closed - A class should be open for extension, but closed for modification. What this practically means is that you should extend functionality by adding a new code and not by modifying it. Your system should be separated into components so it can be easily extended without breaking everything
89103
* Liskov Substitution - Any derived class should be able to substitute the its parent without altering its corrections. Practically, every part of the code will get the expected result no matter which part is using it
90-
* Interface segregation - A client should never depend on anything it doesn't uses
104+
* Interface Segregation - A client should never depend on anything it doesn't uses. Big interfaces must be splitted to smaller interfaces if needed
91105
* Dependency Inversion - High level modules should depend on abstractions, not low level modules
106+
107+
*there also can be module, component, entity, etc. Depends on project structure and programming language
92108
</b></details>
93109

94110
<details>
95111
<summary>What is YAGNI? What is your opinion on it?</summary><br><b>
112+
113+
YAGNI - You aren't gonna need it. You must add functionality that will be used. No need to add functionality that is not directly needed
96114
</b></details>
97115

98116
<details>
99117
<summary>What is DRY? What is your opinion on it?</summary><br><b>
118+
119+
DRY - Don't repeat yourself. Actually it means that you shouldn't duplicate logic and use functions/classes instead. But this must be done smartly and pay attention to the domain logic. Same code lines don't always mean duplication
100120
</b></details>
101121

102122
<details>
103123
<summary>What are the four pillars of object oriented programming?</summary><br><b>
124+
125+
* Abstraction - you don't need to know how this class implemented. You need to know what functionality does it provide (interface) and how to use it
126+
* Encapsulation - keep fields for class purposes private (or protected) and provide public methods if needed. We must keep the data and code safe within the class itself
127+
* Inheritance - gives ability to create class that shares some of attributes of existing classes
128+
* Polymorphism - same methods in different contexts can do different things. Method overloading and overriding are some forms of polymorphism
104129
</b></details>
105130

106131
<details>
107132
<summary>Explain recursion</summary><br><b>
133+
134+
Recursion - process (or strategy), when function calls itself. It has recursive case and exit case. In recursive case we call function again, in exit case we finish function without calling it again. If we don't have exit case - function will work infinite, until memory overload or call stack limit
108135
</b></details>
109136

110137
<details>
111-
<summary>Explain Inversion of Control</summary><br><b>
138+
<summary>Explain Inversion of Control (IoC)</summary><br><b>
139+
140+
Inversion of Control - design principle, used to achieve loose coupling. You must use some abstraction layer to access some functionality (similar to SOLID Dependency Inversion)
112141
</b></details>
113142

114143
<details>
115-
<summary>Explain Dependency Injection</summary><br><b>
144+
<summary>Explain Dependency Injection (DI)</summary><br><b>
145+
146+
Dependency Injection - deisgn pattern, used with IoC. Our object fields (dependecies) must be configurated by external objects
116147
</b></details>
117148

118149
<details>
@@ -129,15 +160,29 @@ True
129160

130161
<details>
131162
<summary>Explain big O notation</summary><br><b>
163+
164+
[habr.com](https://habr.com/ru/post/559518/) "We can use Big O notation to compare and search different solutions to find which solution is best. The best solution is one that consumes less amount of time and space. Generally, time and space are two parameters that determine the efficiency of the algorithm.
165+
166+
Big O Notation tells accurately how long an algorithm takes to run. It is a basic analysis of algorithm efficiency. It describes the execution time required. It depends on the size of input data that essentially passes in. Big O notation gives us algorithm complexity in terms of input size. For the large size of input data, the execution time will be slow as compared to the small size of input data. Big O notation is used to analyze space and time."
132167
</b></details>
133168

134169
<details>
135170
<summary>What is "Duck Typing"?</summary><br><b>
171+
172+
"When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck."
173+
174+
This is direction in programming, where we are checking properties of object, but not it's type
136175
</b></details>
137176

138177
<details>
139178
<summary>Explain string interpolation</summary><br><b>
140-
</b></details>
179+
180+
String interpolation - process of evaluating of string literal. For example (JS):</b>
181+
```js
182+
const messages = 5;
183+
console.log(`You have ${messages} new messages`); // You have 5 new messages
184+
```
185+
</details>
141186

142187
##### Common algorithms
143188

0 commit comments

Comments
 (0)