초급 소프트웨어 엔지니어로서 배운 교훈

게시 됨: 2022-08-30

1년 전에 소프트웨어 엔지니어가 무엇을 했는지 묻는다면 저는 "코드를 통해 문제를 해결하는 것"이라는 말을 했을 것입니다. 우리가 생산하는 작업이 평가되는 방식을 가리키는 간단한 답변입니다. 제품 중심 팀의 엔지니어에게 이러한 문제에는 고객이 요청한 새로운 기능을 구현하는 방법이나 기존 기능의 성능을 개선하는 방법이 포함될 수 있습니다.

오늘 같은 질문을 하면 나는 조금 다른 대답을 할 것이다. 소프트웨어 엔지니어는 코드를 통해 올바른 문제를 해결해야 하며 효과적으로 해결되면 비즈니스 목표를 달성합니다. 어떤 문제를 해결하고 어떻게 해결해야 하는지 파악하는 것은 개발자에게 가장 중요한 부분이며 실제 구현 세부 사항은 부차적입니다.

소프트웨어 엔지니어링으로 가는 나의 길

대학 1학년이 되기 전 여름에 Upperline Code에서 수업을 듣고 프로그래밍에 관심을 갖게 되었습니다. 저는 Opportunity Network라고 불리는 대학 및 직업 준비 프로그램을 통해 이 기회를 얻었습니다.

Upperline Code는 프로그래밍에 대한 나의 첫 입문서였으며, 여기서 내가 코딩을 배우는 데 관심이 있다는 것을 빨리 깨달았습니다. 그해 여름 후반에 저는 Notre Dame 등록 패킷을 받고 College of Arts and Letters에서 College of Engineering으로 전환하여 컴퓨터 공학(CS)을 전공할 수 있었습니다.

내가 가장 좋아하는 CS 코스 중 일부는 알고리즘 설계/분석, 클라우드 컴퓨팅 및 프로그래밍 과제였습니다. 문제는 흥미로웠고 교수들은 새로운 아이디어를 제시하고 개념을 설명하는 데 능숙했습니다.

학부 기간 동안 저는 소프트웨어 엔지니어로 일하고 제가 얻은 기술을 사용하고 싶다는 것을 알고 있었습니다. 고맙게도 3학년이 되기 전 여름에 Kantata에서 소프트웨어 엔지니어로 인턴을 하고 다른 엔지니어들과 짝을 지어 기능을 제공할 수 있는 기회가 있었습니다.

인턴십 경험과 교수님들의 격려의 말씀을 통해 처음 입사 지원을 시작했을 때 다른 역할에 안주하지 않을 수 있다는 자신감을 얻었습니다. 근무 시간에 많은 시간을 보낸 후 저는 2021년 CS 학위로 졸업하고 여기 Sprout Social에서 Associate Software Engineer의 제안을 수락했습니다.

Julius Boateng과 Sprout Social의 동료 그룹

Sprout Social에 정착하기

새로운 역할과 회사에 새로운 사람이 되기 위해서는 일반적인 소프트웨어 엔지니어링 기술과 Sprout 관련 도메인 지식을 모두 개발해야 했습니다. 이해하려면 일반적인 프로그래밍 지식이 필요한 작업이 가장 풀기 쉬웠습니다. 그러나 Sprout의 아키텍처에 대한 지식이 필요한 작업은 처리하는 데 시간이 걸렸고 팀의 도움을 받아야 했습니다. 온라인 문서를 읽으면 해결할 수 있는 몇 가지 문제가 있지만 현재 수행 중인 작업과 관련된 정보를 항상 찾을 수 있는 것은 아닙니다. 다른 사람에게 지침을 요청할 수 있는 것은 매우 중요합니다.

내가 Sprout에 합류했을 때 가장 먼저 눈에 띈 것은 개발 프로세스가 얼마나 협력적인가 하는 것이었습니다. 기능을 개발하는 데 전체 팀이 필요하다는 것은 알고 있었지만 실제로 어떻게 생겼는지 몰랐습니다. 성공적인 기능을 출시하려면 프로젝트 요구 사항을 정의하는 제품 관리자부터 모형을 만드는 디자이너, 기능을 구현하는 엔지니어에 이르기까지 다양한 역할의 많은 사람들이 함께 작업해야 한다는 것을 빨리 깨달았습니다. 협업은 선택이 아니라 팀의 목표를 달성하기 위한 필수 요소였습니다.

시카고 시내에 있는 칼더의 플라밍고 동상 밖에 있는 줄리어스 보트와 스프라우트 동료의 사진

다양한 코드베이스를 탐색하는 방법을 배우고 다양한 서비스가 서로 상호 작용하는 방식에 대한 멘탈 모델을 구축하는 것은 가파른 학습 곡선이었습니다. Sprout의 핵심 비즈니스는 소프트웨어이므로 아키텍처는 비즈니스 요구 사항에 따라 크게 형성됩니다. 작업을 진행하면서 개발자가 해결하려고 하는 비즈니스 문제와 이전 아키텍처 결정이 내려진 이유를 알아야 했습니다.

처음에는 풀 리퀘스트가 코드베이스에 병합되기 전에 검토가 필요하다는 사실이 약간 두려웠습니다. 코드 리뷰의 주요 목적이 지식 공유라는 것을 이해하고 코드 표준을 유지하는 것이 관점을 바꾸는 데 도움이 되었습니다.

코드 검토를 통해 기술 기술을 연마하고 끌어오기 요청의 품질을 개선하는 데 도움이 되었습니다. 동료들이 나에게 무엇을 변경해야 하는지에 대한 조언을 해주고, 새로운 패턴을 소개하고, 코드베이스의 관련 영역을 알려주는 것이 정말 도움이 되었습니다. 다른 엔지니어의 풀 리퀘스트를 읽으면서 내가 직접 작업하지 않는 다른 서비스에 대한 귀중한 가시성을 얻을 수 있었습니다.

이전 경험이 중요합니다

인생의 새로운 단계에 들어서면 이전 경험이 더 이상 중요하지 않다는 생각이 널리 퍼져 있습니다. 대학에 입학하면 고등학교 경험은 더 이상 중요하지 않습니다. 일단 직장에 들어가면 대학 경험은 더 이상 중요하지 않습니다.

그러나 종종 간과되는 것은 우리의 경험, 지식, 습관이 복합적인 영향을 미친다는 것입니다. 우리는 일반적으로 이전에 수행한 작업 덕분에 새로운 것을 달성할 수 있습니다. 내가 이전에 얻은 지식과 기술은 초급 소프트웨어 엔지니어로서 새로운 도전에 접근하는 방법에 큰 영향을 미쳤습니다.

Sprout에서 나의 일상 업무에 가장 직접적인 영향을 미친 학부 수업은 프로그래밍 과제와 데이터베이스 개념이었습니다. 전자는 큰 문제를 더 효율적으로 해결하기 위해 작은 조각으로 나누는 방법을 가르쳐주었습니다. 코드를 구조화하고 코드의 가독성을 개선하는 방법에 대해 더 의도적으로 이해하는 데 도움이 되었습니다.

데이터베이스 개념은 저에게 기본적인 관계형 데이터베이스 개념과 데이터베이스 스키마 디자인 및 SQL과 같은 주제를 가르쳤습니다. 문제를 해결하거나 질문에 답하기 위해 데이터베이스를 쿼리해야 하는 경우가 많기 때문에 쿼리 작성 방법을 배웠습니다.

TurtleBot 로봇 키트의 애니메이션 gif.

교실 밖에서의 기회도 똑같이 소중했습니다. Java는 제 강의 대부분에서 다루는 언어가 아니었지만, 제 교수 중 한 명이 이끄는 비즈니스 프로젝트를 위해 Java를 사용할 기회가 있었습니다. Java 작성, MySQL 데이터베이스 작업 및 Docker 이미지 생성에 대한 실무 경험을 얻었습니다. Java를 배우는 것은 Sprout의 대부분의 서비스가 Java에 작성되어 있기 때문에 특히 도움이 되었습니다.

명령줄을 탐색하고 핵심 프로그래밍 개념을 이해하는 것과 같이, 학부 시절에 제가 당연하게 여겼던 많은 다른 기술들이 있습니다. 학부에서 다루는 대부분의 주제는 본질적으로 이론적인 것이기 때문에 소프트웨어 엔지니어링 경력을 준비할 수 없다는 것은 일반적인 오해입니다. 그러나 저는 그 반대가 사실이라고 믿습니다. 학부에서 배운 기술은 일상 업무에 직접 적용되지 않더라도 중요합니다.

컴퓨터 과학은 매우 광범위한 분야입니다.

CS는 인공 지능, 기계 학습 및 데이터 과학과 같은 다양한 전문 분야를 다룹니다. 학부에서 얻은 경험은 소프트웨어 엔지니어링에만 국한되지 않는 다양한 초급 역할에서 도움이 될 수 있는 기초 지식으로 작용합니다. 학부에서 정규직으로 승진하는 것은 어떤 종류의 역할과 전문 분야가 당신에게 적합한지 알아볼 수 있는 기회를 제공합니다.

소프트웨어 엔지니어링 분야에서 경력을 시작하려는 경우 Sprout은 시작하기에 좋은 곳입니다.