Те, що ви дізнаєтесь на 4-му курсі інформатики

Нещодавно я написав статтю про те, чи потрібна вам ступінь інформатики, щоб отримати роботу в галузі техніки. Я думав, що перегляд моєї стенограми буде корисним. Обговорення того, що я вивчав, допоможе людям. Я хочу, щоб кожен міг прийняти найбільш обґрунтоване рішення, вибираючи свій шлях для подальшої технологічної кар’єри.

Застереження : Це написано з мого згадування занять та з точки зору розробника мобільних пристроїв. Багато тем цих занять можна було б спеціалізувати і перетворити на кар’єру. Тож усі вони важливі для когось у світі. Я пишу з моєї точки зору та з точки зору того, хто вибрав кар'єру мобільного розробника.

Програмування I, II

Це було м’ясом усього, чого я навчився і спонукав мене до програмування. Це були класи, де ви навчилися програмувати. До того, як я пішов на ці заняття, я взагалі ледве навіть програмував. Я намагався отримати фору, але не зайшов набагато далі, ніж петлі.

Цей клас розпочався зі створення порожнього файлу та його компіляції в IDE (я використовував Code :: Blocks). І ми працювали самі до створення власної текстової бойової гри. Озираючись на написаний мною код, мене бентежить. З тих пір я пройшов довгий шлях. Ось репо, якщо ви хочете посміятися (я використовую лише файл main.cpp з 1063 рядками коду).

То що я тут дізнався? Я хочу сказати все. Ці курси були шалено цінними і дали мені принаймні 70% знань, необхідних для професійної роботи програмістом. Я дізнався про оператори if, цикли, логічну логіку, створення класів, створення структур, створення інтерфейсів, поліморфізм, успадкування тощо. Також було деяке використання базових структур даних, таких як масиви та вектори.

Дискретні структури в інформатиці

Цей клас було додано до стенограми, щоб люди звикли до логічної логіки. Який ми провалили у перші два тижні заняття. На жаль для нас, нічого не підозрюючих студентів, це йде досить далеко по кролячій норі. Ось деякі теми, які вона охоплювала: “логіка, операції множин і множин, методи доведення, рекурсивні визначення, комбінаторика та теорія графів”.

Тепер це все корисне, що потрібно знати. Але справа в тому, що студентів заохочували пройти цей клас рано. Зазвичай поряд з Прогаммінгом I і II. І це кілька просунутих тем. Я б зараз намагався використовувати математичні методи доказування. І я пам’ятаю, що тоді я справді боровся. Крім того, мені просто довелося погуглити, що таке комбінаторика, тому я, очевидно, не надто їх використовую.

Справа в тому, що багато речей, які вони викладали на цьому курсі, здавалося не застосовними до кар’єри інформатики на той час, коли я проходив курс. Тепер я знаю, що логіка, операції множин та множин, рекурсивні визначення та теорія графів можуть бути корисними. Але це лише з огляду на минуту, будучи програмістом протягом декількох років.

Що я застосовую щодня у своїй нинішній кар’єрі, це логіка та, можливо, встановлені операції. Рекурсивні визначення та теорія графів насправді були корисними лише для інтерв’ю. Але сприйміть це з достатньою кількістю солі, тому що я мобільний розробник. Розробник із задньої версії, мабуть, знайшов би теорію графів дуже корисною.

Структури даних

Цей клас був хорошим. Дуже добре. Структури даних використовуються у всьому комп'ютерному програмуванні і є основою більшості коду, який люди пишуть. Вони дозволяють нам зберігати дані способом, корисним для програм, які ми пишемо. Вміння переглядати дані та знати, як найкраще зберігати їх для часу та простору, - дуже корисна навичка.

Я дізнався про масиви, стеки, зв’язані списки, подвійно пов’язані списки, дерева, графіки, купи та всі різні смаки цих структур даних (наприклад, самобалансуючі дерева). Цей клас не тільки допоміг мені зрозуміти структури даних, але також допомог мені краще організувати дані, які я зберігав.

Цей клас був зроблений на C, що зробило його ще цікавішим. C може бути дуже вибагливим, але також дуже потужним, якщо його правильно використовувати. Я повинен був бути дуже обережним з тим, як я розподіляв і очищав пам’ять, що також було дуже добре для навчання про управління пам’яттю.

У цьому класі було стільки корисного, що важко охопити їх усі. Я навіть не згадував того факту, що це ключова складова знань для співбесіди в галузі техніки. Якщо ви не впевнені у структурах даних, то почніть роздумувати над деякими основами, оскільки вони дуже важливі.

Аналіз алгоритмів

Цей клас був дещо корисним. Алгоритми корисні. Вони керують найкращим програмним забезпеченням у світі і роблять їх достатньо потужними, щоб залишатися актуальними в сучасному світі. Але у цього класу були деякі проблеми.

Найкориснішою частиною цього було вивчення нотації Big O. Позначення Big O дозволяє оцінити код і зрозуміти, наскільки добре він би працював у часі та просторі. Загалом, якщо ви вимірюєте ефективність коду в компанії, ви будете використовувати таймер для відстеження часу між взаємодіями. Це дозволяє побачити, наскільки добре працює ваше програмне забезпечення. Це вимагає від вас написання коду та оцінки результатів після цього.

Позначення Big O дозволяє вам оцінювати продуктивність коду, просто переглядаючи код. Я не хочу вдаватися в це занадто багато, але якщо ви не знаєте про нотацію Big O, прочитайте цю публікацію в блозі.

Фактичні алгоритми, які ми розглянули, були не такими корисними. Все, що я пам’ятаю, - це проблема рюкзака та проблема продавця. Мені також довелося писати код для них у групах, що не було чудово, тому що в моїй групі була одна людина, яка виходила за рамки того, на що його розглядали. Це означало, що в підсумку я щоразу писав менше коду для остаточної реалізації, ніж хотів би.

Базове розуміння того, які відомі алгоритми існують, їх призначення та способи їх реалізації може бути корисним (здебільшого для співбесіди). Позначення Big O тут є ключовим. Це дуже корисно на роботі, а також неймовірно корисно для співбесіди.

Веб-розробка

Цей клас мав найбільше навичок, які безпосередньо стосувались роботи в галузі техніки. Я дізнався про HTML, CSS, JQuery, JavaScript, PHP та JSON. Я дізнався, як запит надсилається із веб-сайту на задній, як обробляється на задньому, а потім надсилається назад у зовнішній і відповідає. Я навчився створювати інтерфейс користувача та взаємодіяти з рівнем даних, який потім взаємодіє з мережею.

Наприкінці занять я створив власний веб-сайт і виступив з ініціативою вивчати Angular. Я використав Angular, щоб зробити свій сайт виразним, що в підсумку принесло мені моє перше стажування. Я також добре зрозумів, як працює веб-сайт під капотом.

Тільки ці знання були чудовими, але я також навчився підбирати та вивчати незнайому мову, структуру чи формат даних та працювати з ними на льоту. Я багато гуглив на ці теми, щоб побачити конкретні приклади. Я навчився використовувати документацію та онлайн-розслідування, щоб краще зрозуміти концепцію, яку мені потрібно було застосувати безпосередньо за короткий проміжок часу. Це ключова навичка бути вправним програмістом.

Вступ до баз даних

Я в основному щойно вивчив SQL в цьому класі. Я впевнений, що ми переглянули деякі інші поняття, такі як шардінг та кластеризація, але я їх не пам’ятаю. Я іноді використовую SQL на своєму поточному завданні для запуску запитів даних про події, які я ввійшов. SQL або буде невід'ємною частиною вашої роботи, або ви навряд чи будете ним користуватися. Якщо вам це потрібно, навчіться і станьте експертом. Якщо ви цього не зробите, то не турбуйтеся надто про це.

Програмна інженерія I, II

Також ще один клас, якого я справді не пам’ятаю. Я вважаю, що ми розглянули купу широких понять у цьому класі. Ми розглянули методи управління проектами Scrum та Waterfall. Ми переглянули тестування, і всі різні типи тестування існують. Ми розглянули деякі концепції юзабіліті та доступності. Це було насправді просто загалом для концепцій, які насправді не вписувались у власні класи.

Через печворк-характер класу, я насправді не дуже добре засвоїв жодне з понять. Було б добре мати базовий огляд охоплених концепцій, але я б хотів, щоб більше часу було витрачено на такі важливі окремі теми, як тестування.

Архітектура комп’ютера та мова складання

Я добре пам’ятаю цей клас. Цей клас описує, як працює комп’ютер. Як машинні інструкції надсилаються та обробляються комп’ютером. Ми також повинні написати деякий код у MASM, який є мовою збірки, яка дуже тісно взаємодіє з машинним кодом.

Більшість мов програмування, якими я користувався до цього класу, були мовами високого рівня. Мови високого рівня, як правило, наближаються до людської, ніж машинні коди. MASM дуже близький до машинного коду, і я б сказав, що це ближче до машинної мови над людською мовою.

Найважливішою частиною цього класу є отримання уявлення про те, що відбувається з вашим кодом після його компіляції. Дізнатися про різні логічні блоки в комп’ютері та про те, як вони обробляють ваш код, було дуже цікаво.

З практичних цілей, я не думаю, що цей клас був дуже важливим для моєї технічної кар'єри. Дотепер я не використовував багато знань, які отримав із цього класу за свою кар’єру.

Операційні системи

Буду чесним, мені дуже важко згадувати те, про що я дізнався в цьому класі. Єдине, що я пам’ятаю, це створення програми обміну повідомленнями, яка використовувала програмування сокетів на C для спілкування. Я також дізнався про відкриття файлів та маніпулювання папками за допомогою сценаріїв.

Я хочу бути в курсі того, що запам'ятав зі свого ступеня, і справа в тому, що я мало що пам'ятаю з цього класу. Я просто не використовував багато знань, отриманих від цього, у своїй нинішній кар’єрі.

Вступ до комп’ютерних мереж

Цей клас був дуже корисним. Це переглянуло, як функціонують комп’ютерні мережі. Це включало перегляд мережевих протоколів, таких як HTTP, HTTPS, TCP, IP, FTP, IMAP, POP3, SSH та DNS. Я повинен був дізнатись про те, для чого використовується кожен із цих протоколів, як вони реалізовані, та зрозумів, чому вони були створені.

Мережеві протоколи, про які я згадав вище, використовуються для критичних функцій сучасного програмного забезпечення. Це включає обробку електронної пошти (POP3 та IMAP), надсилання мережевих запитів між клієнтом та сервером (HTTP, HTTPS) та безпечну обробку пристроїв через мережу (SSH). Це справді дає вам розуміння того, як працює Інтернет і як пристрої у всьому світі можуть взаємодіяти між собою.

Це не тільки захоплююче, але й може бути корисним. Я використовував те, що дізнався з цього класу, для налагодження проблем, з якими стикався, коли отримував помилки в мережі. Я зміг визначити проблеми, з якими стикався, і допомогти розробнику, з яким я працював, знайти помилку на їх кінці.

Вступ до техніки юзабіліті

Цей клас розповідав про те, як зробити інтуїтивно зрозумілий додаток, а також про те, як зробити додаток чи веб-сайт доступними. Доступність - це надання програмного забезпечення, придатного для використання будь-ким, включаючи людей з обмеженими можливостями. Це охоплює такі речі, як використання тексту в мовлення та розробку програмного забезпечення, яке не повністю залежить лише від звукових елементів.

Висвітлені теми були корисними, якщо ви ніколи раніше не чули про доступність. Це принаймні змусило вас розглянути ці речі, коли ви розробляєте програмне забезпечення. Це також змусило мене по-справжньому почати думати про досвід користувачів і про те, наскільки це важливо для хорошого програмного забезпечення. Якщо ніхто не використовує ключову функціональність вашої програми, оскільки вона заплутана, тоді ваше програмне забезпечення з часом втратить усіх своїх користувачів.

Хоча знання були цікавими, конкретні варіанти реалізації того, як ви можете створити корисну та доступну частину програмного забезпечення, залежать від платформи. Наприклад, Apple має власний набір інструкцій щодо користувальницького інтерфейсу, що описує загальні принципи проектування та конкретні деталі того, як слід розробляти програмне забезпечення, яке працюватиме на будь-якій з платформ Apple.

Через конкретну інформацію, необхідну для кожної платформи, я не впевнений, що цей клас був неймовірно корисним. Це було приємне вступне слово, але в підсумку мені довелося вивчити інструкції щодо інтерфейсу Apple, які переглядали всі теми, висвітлені в цьому класі.

Розробка мобільного та хмарного програмного забезпечення

Я буду тримати цей короткий. Коли я проходив цей курс, я вже був мобільним інженером. За кілька годин я створив безглуздий мобільний додаток, щоб якомога швидше закінчити диплом. На даний момент я вже досяг своєї мети влаштуватися на роботу інженером-програмістом, але мені потрібно було закінчити свій комп, оскільки я майже закінчив. Моє серце не хотіло вчитися в цей момент.

Навіть з урахуванням сказаного, я не думаю, що цей клас пройшов добре. Він був ліниво розроблений. Вони закликали людей писати код для програми для телефону Windows для цього класу, і попит на ці роботи набагато нижчий, ніж інші. І я відчуваю, що це заохочувалося лише тому, що середовище простіше налаштувати, а код може бути написаний на JavaScript і нагадує веб-розробку.

Крім того, мені було зрозуміло, що людина, яка керує класом, не знала про всі платформи мобільних додатків. Нас вимагали написати невелику задню частину, але я справді не хотів. Я в підсумку підробив веб-запит, замість того, щоб прочитати з диска і повернути готову відповідь через кілька секунд. Це спрацювало, тому що мені довелося подати лише демо-версію та вихідний код. І я відчуваю, що той, хто оцінював, дивився лише на демо.

Загалом, у класі викладали застарілі та невикористані технології, не оцінювались належним чином і насправді не пропонували особливих вказівок. Це був не дуже хороший клас.

Проект програмного забезпечення Capstone

Говорячи про застарілі технології, цей проект вимагав від нас побудови графічного інтерфейсу для доступу до бази даних за допомогою проклять. Ось повний проект, якщо вам цікаво. Ми не змогли вибрати, яким був наш головний проект, він був нам доручений. І всі мали зробити один і той же проект. Це також було зроблено в групах по 3 особи, тож ви насправді охопили лише одну невелику частину проекту. Це був дійсно погано проведений клас.

Взаємодії з викладачем майже не існувало. Я не мав нульового інтересу до проекту, і те, що ми вивчали, здавалося абсолютно марним. Щоб зацікавити тему, потрібно дати людям трохи свободи волі, коли справа доходить до вибору того, що вони дізнаються. Відсутність вибору у вашому проекті головного каменю просто безглуздо. Цей проект марний для більшості кар’єрних шляхів, і немає сенсу нав'язувати його людям.

Клас повинен був змусити кожного студента подати пропозицію із приблизними оцінками щодо строків, коли вони закінчать кожну частину проекту. Це досягає двох речей: змусити людей почати практикувати оцінку роботи та дозволяти людям працювати над тим, що їх цікавить. Клас таким чином був би в 100 разів кращим.

Заключні думки

Я не міг пройти хорошу частину занять і все ще бути інженером-програмістом, яким я є сьогодні. Але я думаю, що втрата деяких з цих курсів може залишити величезну прогалину у ваших знаннях як розробника. Темами, які, на мою думку, повинен мати якийсь інженер-програміст, є Структури даних та Алгоритми.

Інші класи залежать від обраної вами кар’єри. Якщо ви вирішили піти на вбудовану розробку, вам слід дізнатися про комп’ютерну архітектуру. Якщо ви вирішите стати інженером-розробником, вам слід дізнатись про комп’ютерні мережі.

Ключовим виводом тут є те, що хороший інженер постійно вчиться. Якщо вам не вистачає деяких знань, які, на вашу думку, були б корисними та застосовними у вашій роботі, тоді йдіть на заняття, щоб отримати ці знання. Ось так ви покращуєте написання хорошого коду. Завжди вчіться.

Сподобалось прочитане? Перегляньте інші мої статті

Починати технологічну кар’єру з нічого.

Виберіть для себе найкращу технологічну кар’єру - Dev Ops, мобільний інженер, науковець даних, менеджер проектів та Front End.

Поради для першого технічного інтерв’ю.

Чи повинні ви отримати ступінь інформатики?

Свіфт проти Objective-C