테오님의 프론트엔드 개발자에게 알고리즘 공부가 미치는 영향을 읽고

Lee Tae-Sung·2021년 12월 14일
1

https://velog.io/@teo/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%97%90%EA%B2%8C-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B3%B5%EB%B6%80%EA%B0%80-%EB%AF%B8%EC%B9%98%EB%8A%94-%EC%98%81%ED%96%A5

0과 1이 모여서 '숫자'가 되고 '문자'가 되고 '배열'이 되고...

=> 다시 한번 리마인드하게 됐지만 지금 공부하고 있는 CNN의 이미지도 0과 1로 이루어진 데이터이다.

0과 1만으로는 실제 현실과는 매우 동떨어진 형태입니다. 초기 프로그래밍의 경우에는 실제로 메모리에 0과 1을 넣는 식으로 개발을 했죠. 이러한 언어를 기계어(에셈블러)라고 합니다.
=> 어셈블러

그래서 우리가 알고리즘을 배운다는 것은 여러가지의 자료구조와 그 자료구조로 할 수 있는 문제 해결 방법중 현재까지 만들어진 가장 효율적인 방법이 무엇인가를 배우는 것입니다.
=> 효율적인 방법을 판단하는 기준 중 O(n) 시간복잡도도 포함됨.
=> 지금까지는 알고리즘 공부하면서 시간복잡도를 따져본적이 없었는데 고려해야함

2. 알고리즘 공부에서 배워야 하는 것

O(n) 시간복잡도

알고리즘은 보다 효율적인 방법을 찾는 거라고 했습니다. 그렇다면 어떤 알고리즘이 더 좋은지 비교할 수 있는 방법이 필요하겠죠. 그러기 위해서는 기준이 필요합니다. 기계의 성능이나 언어의 성능은 고려되어서는 안되겠죠. 그래서 만들어 낸것이 시간 복잡도라는 개념입니다.

=> 그러고보니 정말 순수하게 알고리즘의 점수를 평가할 수 있는 기준이 될 듯 함.

=> 이 그래프 암기하기

선형검색과 이진검색(반띵전략)

이렇게 반씩 줄여가는 전략은 향후 배울 모든 알고리즘을 한단계 더 효율적으로 만들어주는 근간이 됩니다.

=> 이런식으로 효율성의 차이가 날 수 있음

정렬:순서대로 줄세워보자.

누구나 생각하는 그 방법: 선택정렬(Selection Sort)

배열에서 제일 작은것을 선택해서 맨앞으로 보내고 남은 것들 중 또 제일 작은 것을 선택해서 2번째에 놓고 이렇게 하는 방식입니다.

=> 결국 정렬을 통해 제일 작은 것이라는 특정한 조건의 데이터를 선택할 수 있게 됨.
=> 현실세계에서도 책을 순서대로 정리해서 내가 ㄴ 으로 시작하는 책을 선택하는 과정과 동일

좀 더 복잡하지만 빠른 방법: Quick Sort!

https://www.youtube.com/watch?v=cWH49IKDIiI&t=548s

그래서 알고리즘 공부가 왜 필요한가?

현실 세계의 문제를 현실을 방식을 본따 그대로 만들었는데 그 성능의 비용이 비싸다면, 조금 더 컴퓨터스럽게 생각하는 방법을 통해서 최적화하는 방식을 배우기 위해서 입니다.

그렇다면 프론트엔드는 알고리즘을 몰라도 되지 않나요?

분명 프론트엔드 개발자가 추구하는 개발의 방향은 컴퓨터스러운 방식이 아닙니다. 오히려 최적화를 덜 하고 보다 기획서에 가깝게 사람에 가깝게 코딩을 하는 방식을 더 추구합고자 합니다. 분야의 특성상 코드의 최적화보다 가독성을 훨씬 더 중시하고 더 사람에 가깝게 만드는게 더 중요합니다.

=> 실제로 프론트엔드 개발을 하면서 알고리즘이라고 할만한 부분이 중요하게 느껴지진 않았음.

⭐️ 우리가 현실의 문제를 이미 만들어진 자료구조 속의 세계관까지만 끌고 오면 자료구조의 문법으로 해당 문제를 바라 볼 수 있고 이미 해결된 좋은 방법으로 문제를 해결할 수 있다!

=> 자료구조의 문법 안에 넣어 해결되는 부분들이 있군(실제로 느껴본적은 없음)

3. 그래서 프론트엔드 개발자에게 알고리즘 공부가 미치는 영향

  1. 프론트엔드 개발자의 능력인 기획의 요구사항을 String, Array, Object와 같은 형태의 값으로 만들어내는 과정을 하는데 있어서 이것을 센스를 그냥 타고 나는 사람들도 있지만 알고리즘과 자료 구조를 배우다보면 현실의 생각을 컴퓨터스럽게 데이터로 사고하는 능력을 간접적으로 익힐 수가 있습니다.

=> 이 말이 맞는듯 컴퓨터스럽게 생각하게 되는듯

  1. 또한 프론트엔드라고 해서 알고리즘을 사용한다거나 최적화 작업이 아예 없을 수는 없습니다. 프론트엔드가 최적화가 필요한 경우에는 어떠한 알고리즘이 있는지를 알아야 아니라 알고리즘을 최적화 하는 원리인 분할정복, 동적계획법, 탐욕법 등에 대해서 알아야 할 경우가 있습니다.

=> 실제로 벡엔드에서 부족한 부분을 프론트엔드에서 알고리즘으로 채워주기도 하고 특정 기능을 위해 프론트엔드 주머니에서도 굴려야하는 경우가 존재.

그래서 어떠한 알고리즘이 있는지 사전적인 공부보다는 현실문제를 어떤식으로 데이터로 생각하고 어떠한 접근법으로 최적화를 하는가에 대한 공부를 한다고 생각하시며 공부하시길 바랍니다.

느낀점

실제로 프론트엔드로 프로젝트를 진행하면서 알고리즘을 활용한 적이 없다.

아니 있었다 ;;;

그런데 그건 솔직히 말하면 벡엔드에서 문제가 발생했을때 벡엔드에서 처리해주면 좋을 알고리즘들을 프론트로 끌고와서 처리해버렸을 경우다.

그래서 정말 완벽한 벡엔드 개발자와 일한다면 프론트에서 알고리즘을 쓸 일이 없을 수도 있겠다는 생각을 했다.

최근 알고리즘 스터디를 진행하며 취업용 또는 이직용이라는 생각을 많이 했다.

그런데, 생각지도 못했던 부분들을 이 글을 보고 깨닫게 되었다.

확실히 알고리즘을 공부하기 전과 나의 개발 머리는 조금 달라져있는듯 하다.

알고리즘 문제를 풀기위해선 0과 1과 for문 if문과 데이트를 해야한다.

실제로 지금 js 알고리즘 문제를 오랜만에 풀고 있는데 js에서 놓치고 있던 문법들과 코딩 과정들등을 다시 돌아보고 아 맞다! 아 재밌구먼 하는 포인트들이 굉장히 많았다!

내가 꿈꾸는 최고의 회사(평생 다니고픈) 혹은 내가 회사를 차린(?) 경우가 아니라면 하루에 하나씩이라도 꾸준히 취미생활로 정착시키면 좋을 것 같다.

아자!

profile
긍정적인 에너지를 가진 개발자, 이태성입니다.

0개의 댓글