Фундаментальні знання

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

Фундаментальні знання

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

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

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

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

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

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

    private static void traverse(int[][] graph) {
        boolean[] visited = new boolean[graph.length];
        Deque<Integer> stack = new ArrayDeque<Integer>();
        stack.push(0);
        while(!stack.isEmpty()) {
            int v = stack.pop();
            
            if(visited[v]) continue;
            
            processVertex(v);
            
            for(int i=0; i<graph[v].length; i++) {
                if(graph[v][i] == 1) stack.push(i);
            }

            visited[v] = true;
        }
    }

Зараз, споглядаючи назад та, розуміючи як треба було б вирішувати ту задачу, я посміхаюсь, усвідомлюючи, що фундаментальні знання важливі. Чи можна стати програмістом за 3-6 місяців? Легко, я сам так зробив! Але чи вийде ефективно виконувати весь той спектр задач, які постають перед розробником? Навряд. Навіть, закінчивши курси чи перевчившись за пришвидшеною програмою, вам доведеться витратити сотні годин на вивчення алгоритмів, баз даних, математики та іншого. Звісно, можна і без цього, але виходить погано.

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

Я люблю визнавати, що був неправий, бо це призводить до нового, кращого розуміння світу. Десять років тому я помилявся. Фундаментальні знання - важливі!

P.S. Перші три людини, які вгадають, що описує граф на початку статті отримають від мене невеличкий подаруночок. Якщо є ідеї - пишіть на hello[собачка]vilnyi.com.

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