Какво научавате в 4-годишна степен по компютърни науки

Наскоро написах статия за това дали имате нужда от степен по компютърни науки, за да получите работа в сферата на технологиите. Мислех, че преглеждането на моя препис би било полезно. Обсъждането на изученото от мен ще се надява да помогне на хората. Искам всички да могат да вземат възможно най-информираното решение, когато избират своя път за преследване на технологична кариера.

Отказ от отговорност : Това е написано от спомена ми за класовете и от гледна точка на мобилен разработчик. Голяма част от темите на тези класове биха могли да бъдат специализирани и превърнати в кариера. Така че всички те са важни за някого по света. Пиша от моя гледна точка и от гледна точка на някой, който е избрал кариерния път на мобилен разработчик.

Програмиране I, II

Това беше месото на всичко, което научих и ме подтикна към програмирането. Това бяха класовете, в които се научихте да програмирате. Преди да взема тези класове, изобщо едва бях програмирал. Бях се опитал да получа предимство, но не стигнах много повече от цикли.

Този клас започна със създаването на празен файл и с неговата компилация в IDE (използвах Code :: Blocks). И ние работихме по целия път, за да създадем наша собствена текстова битка. Поглеждайки назад към кода, който написах, ме смущава. Оттогава съм изминал дълъг път. Ето репото, ако искате да се посмеете (използвам само файл main.cpp с 1063 реда код).

И така, какво научих тук? Искам да кажа всичко. Тези курсове бяха безумно ценни и ми осигуриха поне 70% от знанията, от които се нуждаех, за да работя професионално като програмист. Научих дали изрази, цикли, логическа логика, създаване на клас, създаване на структури, създаване на интерфейси, полиморфизъм, наследяване и др. Използваха се и основни структури от данни като масиви и вектори.

Дискретни структури в компютърните науки

Този клас е добавен към стенограмата, за да свикне хората с логическа логика. Което имахме надолу през първите две седмици от класа. За съжаление на нас, нищо неподозиращите ученици, това отива доста надолу по заешката дупка. Ето някои от темите, които тя обхваща: „логика, операции за множества и множества, методи за доказване, рекурсивни дефиниции, комбинаторика и теория на графовете“.

Това са полезни неща, които трябва да знаете. Но въпросът е, че учениците бяха насърчавани да посещават този клас по-рано. Обикновено заедно с Progamming I и II. И това са някои напреднали теми. Бих се борил сега да използвам математически методи за доказване. И си спомням, че тогава наистина се борех. Освен това просто трябваше да потърся в Google какво представлява комбинаториката, така че очевидно не ги използвам твърде много.

Факт е, че много от нещата, които са преподавали в този курс, не изглеждаха приложими за кариера на компютърните науки по времето, когато взех курса. Вече знам, че логиката, операциите за задаване и задаване, рекурсивните дефиниции и теорията на графовете могат да бъдат полезни. Но това е само с оглед на това да бъдеш програмист в продължение на няколко години.

Това, което прилагам ежедневно в настоящата си кариера, е логиката и може би определени операции. Рекурсивните дефиниции и теорията на графовете наистина са били полезни само за интервюта. Но приемете това с известна доза сол, защото аз съм мобилен разработчик. Разработчик на заден край вероятно би намерил теорията на графовете за много полезна.

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

Този клас беше добър. Много добре. Структурите на данни се използват в цялото компютърно програмиране и са гръбнакът на повечето от кода, който хората пишат. Те ни позволяват да съхраняваме данни по начин, полезен за програмите, които пишем. Способността да гледате данните и да знаете най-добрия начин да ги съхранявате за време и пространство е много полезно умение.

Научих за масиви, стекове, свързани списъци, двойно свързани списъци, дървета, графики, купчини и всички различни вкусове на тези структури от данни (като самобалансиращи се дървета). Този клас не само ми помогна да разбера структурите на данни, но ми помогна и да организирам по-добре данните, които съхранявах.

Този клас беше направен на 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

Говорейки за остарели технологии, този проект изискваше да изградим GUI за достъп до база данни, използвайки проклятия. Ето пълния проект, ако се интересувате. Не успяхме да изберем какъв е нашият основен проект, той ни беше възложен. И всички трябваше да направят един и същ проект. Това беше направено и в групи от по 3 души, така че наистина покрихте само една малка част от проекта. Това беше наистина зле проведен клас.

Взаимодействието с учителя почти не съществуваше. Имах нулев интерес към проекта и това, което научавахме, изглеждаше абсолютно безполезно. За да създадете интерес към дадена тема, трябва да оставите хората да имат малко свободна воля, когато става въпрос за избор на това, което ще научат. Да нямаш избор в своя проект за камък е просто глупаво. Този проект е безполезен за повечето кариерни пътища и няма смисъл да го налагаме на хората.

Класът трябваше да накара всеки ученик да представи предложение с приблизителни приблизителни срокове за това кога ще завърши всяка подчаст на проекта. Това постига две неща: да накара хората да започнат да практикуват оценка на работата и да позволят на хората да работят върху това, което ги интересува. Класът щеше да бъде 100 пъти по-добър по този начин.

Финални мисли

Не бих могъл да взема добра част от класовете и да продължа да бъда софтуерният инженер, какъвто съм днес. Но мисля, че пропускането на някои от тези курсове може да остави огромна пропаст във вашите познания като разработчик. Темите, които мисля, че всеки софтуерен инженер трябва да има известни познания, са Структури на данни и Алгоритми.

Останалите класове зависят от избраната от вас кариера. Ако сте решили да влезете във вградената разработка, трябва да научите за компютърната архитектура. Ако решите да станете начален инженер, трябва да научите за компютърните мрежи.

Ключовият извод тук е, че добрият инженер непрекъснато се учи. Ако ви липсват някои знания, които знаете, че биха били полезни и приложими във вашата работа, отидете на клас, за да придобиете тези знания. Ето как се подобрявате при писането на добър код. Винаги се учете.

Хареса ми четеното? Вижте другите ми статии

Започване на технологична кариера от нищо.

Изберете най-добрата технологична кариера за себе си - Dev Ops, Mobile Engineer, Data Scientist, Project Manager и Front End.

Съвети за първото ви техническо интервю.

Трябва ли да получите степен по компютърни науки?

Суифт срещу Обектив-С