Week2 - 본격적인 역량강화 스타또😀


드디어(?) 1주차 기획 개발 수업이 끝나고 이번 주 부터는 본격적으로 개발 공부와 프로젝트 팀을 빌딩하는 역량강화 기간이 시작되었다 !
물론, 기획 개발 기간동안 기획자와 디자이너분들과 개발자로써의 협업을 어떻게 해야하는 지, 기획 단계에서 어떤 과정들이 진행되는 지 알 수있는 유익한 수업시간이었지만 얼른 부족한 역량을 채우기 위해 개발 공부를 하고 싶었다 ㅎㅎ

이번 주차는 수업이 진행이 되었던 부분이 아니라서 따로 기록해둔 점이 없기도 하고 적응하는 데에 너무 바빴었던 지라 기록해둔 것이 없어 일지 작성이 어려운 것 같다. ㅠㅠ 다음 주차부터는 매일 매일 무슨 일이 있었는 지, 중요했던 부분들이나 기억에 남았던 부분들에 대해서 기록을 좀 해둬야 겠다.

역량강화 기간은 크게 교양강화, 전공강화, 프로젝트 계획 형식으로 나뉘어진다.


Daily Meeting

이번 역량강화 기간동안에는 매일 오전 9시부터 10시까지 1시간동안 팀이랑 전 날 진행했던 Task의 결과, 오늘 진행할 Task, 여러 공유사항, Fun Facts (TMI 등 재밌는 이야기) 를 공유하는 방식으로 Daily Meeting 시간이 진행이 된다.

첫 데일리 미팅 시간에는 첫 시간이라 그런 지 어려운 주제가 아닌데도 작성하는 데에 많이 어려웠고, 팀원들도 그런 것(?) 같았다.
하지만, 점차 날이 지날 수록 작성하는 데에 크게 어려움이 없었고, 오히려 팀원들과 Task 결과들과 계획, TMI 등을 공유하면서 더 친밀해질 수 있었고, 공유사항들을 공유하면서 협업을 진행하는 데에 정말 유익했던 시간이었던 것 같다.

거의 이런식으로 진행이 된다.
9:00 ~ 9:15 : 템플릿 작성하기
9:15 ~ : Task 결과 및 계획, 공유사항, Fun Facts 공유하기

이 후로는 좀 시간이 남게되는데, 이 부분에 있어서는 마지막 날인 금요일에 그룹 회고를 통해 활용방안에 대해 얘기를 해보았다.


교양강화

교양강화 시간은 각 팀이 맡게 된 교재를 읽은 후, 발표를 통해 강의 후 질문을 하는 형식으로 진행이된다.

그래서 주말에 교양강화 교재를 읽느라 혼이 났다.

평소에 독서습관을 기르지 않았던 탓도 있지만.. 책을 읽는데도 시간이 많이 걸리기도 했고, 철학적(?)인 주제로 소프트웨어 개발을 다루는 부분에 있어서 어려워서 읽던 부분 또 읽고 또 읽고해서 어려웠던 것 같다...

주말동안 읽은 독서 교재는 읽기 좋은 코드가 좋은 코드다 , 애자일 마스터 이다.

읽기 좋은 코드가 좋은 코드다는 React 팀이 맡게 된 교재이면서, 코드를 작성할 때, 어떻게 작성하면 좋을 지, 클린 코드( 가독성이 좋은, 모두가 이해하기 쉬운)를 작성하기 위한 원칙들에 대해서 소개하고, 공부할 수 있는 교재이다.

애자일 마스터는 우리 Android 팀이 집중적으로 맡게 된 교재이고, 애자일 방법론에 대해 다룬 교재이다.
애자일 방법론을 추구하는 사람뿐만 아니라 소프트웨어 개발자를 준비하는 우리에게 배울 요소가 진짜 많다고 생각이 되는 교재들이다.
애자일적인 사고방법은 애자일 프로젝트를 진행할 때 뿐만 아니라 여러 방면에서 사용될 수 있다고 생각이 들었다.

그 외에도 SQL 첫 걸음, 함께 자라기 - 애자일로 가는 길 등 정말 유익한 교재들이 교양강화 주제 도서들로 선정되었다 !


이번 주차에 교양강화 수업에서 진행한 애자일 마스터를 팀원들과 같이 정리해보았다.

1. 애자일의 핵심

1장에서는 애자일의 핵심이 무엇인 지 ? 애자일 계획은 어떻게 세우는 지 ? 애자일 프로젝트의 완료의 의미는 어떤 것인지에 대한 내용을 다루었다.

애자일의 핵심은 매 주 가치를 전달하는 것 이다.

정말 중요한 애자일에서의 핵심은

" 작동가능한 소프트웨어를 정기적으로 지속적으로 고객에게 전달하는 것이다. "

이런 애자일의 핵심을 실천하기 위해서는 다음과 같은 과정들이 필요하다.

1. 큰 문제들을 작은 문제들로 세분화하라
2. 가장 중요한 것에 먼저 집중하고, 다른 것들은 다 잊어버려라
3. 소프트웨어가 제대로 작동하는지 확인하고 또 확인하라
4. 피드백을 구하라
5. 필요하다면 계획을 바꾸라
6. 책임감을 가져라

그렇다면 다음과 같은 과정을 위해서 계획은 어떻게 세워야 할까 ?

마스터 스토리 리스트 , 사용자 스토리 를 작성한다.

마스터 스토리 리스트사용자 스토리 와 개발팀이 매겨놓은 추정치에 따라 우선순위로 분류되어 있는 리스트를 의미한다.
사용자 스토리 는 프로젝트에서 고객이 요구하는 기능이라고 생각하면 된다.

이터레이션이라는 단어를 먼저 알아야 한다. 애자일 방법론 중 하나인 스크럼 방법론의 스프린트와 유사하다고 볼 수 있다.

마스터 스토리 리스트를 통해서 각 이터레이션 마다 팀이 완성할 수 있는 작업량을 통해, 프로젝트의 성공의 척도를 알 수 있다.

그렇다면 고객에게 전달하기 위해 프로젝트를 완료해야 할 것이다. '완료'의 의미가 정확히 무엇일까 ?

완료는 코드를 출시 가능한 상태로 만들기 위해 해야 할 모든 일을 수행하는 것을 말한다. (분석, 설계, 테스트, UX, 디자인)

하지만 이러한 엄격한 '완료'의 의미에서 우리는 좌절되곤 하는데, 이럴 때 세가지 진실을 적용하면 좋다.

세가지 진실

  • 프로젝트 초기에 요구사항을 모두 수집하기는 불가능하다.
  • 수집한 요구사항들이 무엇이든 반드시 변하기 마련이다.
  • 시간이나 비용이 허락하는 것보다 해야 할 일들이 항상 더 많다.

다음과 같은 세가지 진실을 받아들임으로써 우리는 '완료'에 대해서 스트레스와 고민을 덜 수 있다.

실제로, 학부과정에서 졸업작품 수업을 들었을 때, 유사한 애자일 경험을 하였던 것 같다.

  • 1~2주 or 3주마다 교수님과 수강생들을 상대로 프로젝트의 진행사항 , 산출물 을 발표한 적이 있는데, 이런 경험이 이터레이션마다 가치를 전달하는 것과 같았다고 생각이 들었다.

  • 핵심 기능을 구현하기 위해 모든 팀원이 계획을 변경 하고, 함께 해결하였던 경험이 있다.

  • 기능이 계속 추가되면서 요구사항과 계획이 계속 수정되면서 UML 다이어그램과 요구사항 목록을 수정하면서 많은 시간을 할당하느라 최종작품 제출에 시간적으로 많은 부담과 스트레스를 경험한 적이 있는데, 이 때 세가지 진실을 적용해보았다면 더 좋았을 것 같다.


2. 애자일 팀 만나기

2장에서는 애자일 팀을 더 애자일답게 하는 것은 무엇인지, 팀원을 꾸리기 위해 어떤 팀원들로 구성하는 것이 좋은 지에 대해 알려준다.

애자일에서는 불분명한 역할분담, 분석과 개발, 테스트 활동이 끊임없이 진행되는 개발과정, 한 팀으로서의 책임감 등에 대해서 경험하게 된다.

따라서 가능하면 같은 공간에서 일하는 것이 중요하고, 고객참여하는 고객으로 만드는 것이 중요하다. 참여하는 고객은 피드백을 통해 프로젝트의 성공에 기여할 수 있다. 또한 애자일에서는 불분명한 역할분담의 성질이 있기 떄문에, 모두가 책임감과 자율성을 가질 수록 좋고, 각자가 맡은 업무에 초점을 두는 것도 중요하지만, 자율성을 가지고 자신이 할 수 있는 일이 더 있다면 그 일을 맡아서 수행하는 자기조직화가 중요하다.

물론, 개발팀 모두가 전반적인 업무를 맡아서 수행할 수 있는 교차기능팀이면 더 좋다.

따라서, 이러한 자격을 갖추는 팀원일 수록 더 좋다는 얘기이다.


3. 모두 한 버스에 타는 법

3장에서는 프로젝트의 실패를 막는데에 중요한 껄끄러운 질문들을 하기 위해 사용되는 도구인 인셉션 덱에 대한 내용을 다룬다.

인셉션 덱 : 프로젝트를 시작하기 전에 반드시 물어야 하는 10개의 까다로운 질문

인셉션은 프로젝트 초기단계에 고객과 개발팀이 서로를 알아가는 과정을 갖는 일정한 기간을 말한다.

인셉션 덱의 핵심 10가지는 다음과 같다.

  • 우리가 여기 왜 모였는지 물어보라
  • 엘리베이터 피치를 만들라
  • 제품의 광고를 디자인하라
  • Not 리스트를 작성하라
  • 프로젝트와 관계된 다양한 사람들과 알고 지내자
  • 해결책을 보여주자
  • 미리 야근 거리가 될 만한 것을 찾아보자
  • 규모를 정하라
  • 우선순위를 파악하라
  • 기회비용이 무엇인지 파악하라

전공강화

전공강화 시간은 각 팀이 맡게 된 교재를 학습 후, 발표를 통해 강의 후 질문을 하는 형식으로 진행이 된다.

선정된 교재는 코틀린 완벽가이드로 앞으로 Android 개발에 앞서 필요한 Kotlin , 코루틴 등 여러 기초적인 학습을 할 수 있다.

학습일지에 정리한 내용을 올리는게 맞을 지는 모르겠지만..

먼저, 우리 팀은 Java와 비교하였을 때 or Kotlin 언어가 가지는 강점을 주제로 발표하기 위해 정리를 진행하였다.
발표 범위가 많기도 해서, 중요한 부분만 캐치해서 정리를 하였는데, 그 부분마저도 많아서 ㅋㅋ 내가 중요하다고 싶은 몇 부분만 올려보고자 한다.


Null Safety

뭐니뭐니 해도 Kotlin 은 정적 타입 언어로써, Java에서 제공하지 않는 Null Safety기능에 대해서 얘기해보고자 한다.

먼저 KotlinNullable TypeNon-Nullable Type으로 나뉜다.
타입 뒤에 ?를 붙여주면 되는 것이라 자세한 설명은 생략하겠다.

val strValue : String? = null

Nullable Type 변수는 다음과 같이 선언하면 된다.

먼저 non-null asserted operatorsafe call operator 에 대해서 알아보자.

non-null asserted operator(!!) 는 말 그대로 널 아님 단언 연산자 이다.
컴파일러에게 null이 아님을 알려주는 연산자라고 생각하면 좋을 것이다.

non-null asserted operator(!!) 예시를 살펴보자.

fun main() {
	var strValue : String? = null
	if (strValue.isEmpty()) println(" strValue is Empty. " ) 
}

다음과 같이 작성하게되면, Kotlin 컴파일러는 Nullable Type 값이 null이 될 수 있으므로, 처리해주길 원하며, 다음과 같은 코드는 에러가 발생할 것이다.

fun main() {
	var strValue : String? = null
	if (strValue!!.isEmpty()) println(" strValue is Empty. " ) 
}

그래서 다음과 같이 널 아님 단언 연산자를 사용하여 작성을 하면, 당장 컴파일러가 표시하는 오류는 줄일 수 있지만,
실제로 strValue에는 null값이 들어가있고, null값이 들어있는 수신객체에 !!를 붙이게 된 후, 코드를 실행하게 되면
우리가 Java에서 자주 접할 수 있는 NPE (NullPointerException)을 만날 수 있다.

이는 Kotlin에서 제공하는 Null Safety 기능을 잘 활용하지 못한 사례이다.

반면에, 우리는 null값이 있더라도 프로그램이 중단되지 않고 에러메시지를 전달하는 쪽으로도 안전하게 처리할 수 있다.

safe call operator(?.) 예시를 살펴보자.

fun main() {
	var strValue : String? = null
	checkNullableStr( strValue )
}

fun checkNullableStr( strValue : String? ) { 
	if (strValue?.isEmpty()) println(" strValue is Empty. " ) 
} 

다음과 같이 작성하게되면 strValue 값이 null일 때, null.isEmpty() 가 실행되어 런타임에서 오류가 발생하는 것이 아니라
자체적으로 strValue?.isEmpty()null을 반환하게 된다. 따라서 런타임 오류의 발생을 막아줄 수 있다.


Singleton + lazy

Singleton 패턴 - 객체의 인스턴스를 1개만 생성하여 재사용하는 패턴.

Singleton 패턴은 다음과 같이 객체의 인스턴스를 재사용하는 패턴으로, 메모리 공간을 효율적으로 사용할 수 있어 자주 사용되는 패턴이다.

하지만 Java에서 Singleton 패턴을 사용하는 코드는 많은 보일러 플레이트 를 포함하고, 이는 가독성을 떨어뜨리며, 오류를 발생시킬 가능성을 높인다.

보일러 플레이트 => 반복적인 형태의 코드가 여러 곳에서 재사용 되는 것.

반면에, Kotlin 에서는 어디서든 호출할 수 있는 장점이 있는 object 객체를 이용하여 Singleton패턴을 더 쉽게 구현할 수 있다.

예시 코드를 살펴보자.

  • 자바 Singleton
public class SingletonClass {

    private static SingletonClass instance; // 클래스의 인스턴스

    public String sampleString = "Sample String"; // 객체에서 사용할 멤버

    private SingletonClass() { } // 생성자

    public static synchronized SingletonClass getInstance() {
        if( instance == null ) {
            instance = new SingletonClass(); // 객체가 생성되어 있지 않으면 객체 생성.
        }

        return instance;
    }

}
  • 코틀린 Singleton
    object SingletonObject {
        // val sampleString = "Sample String"  // 객체에서 사용할 프로퍼티
    
        val sampleString by lazy { "Sample String" }  // 객체에서 사용할 프로퍼티
    }

어느 위치에서든 Object의 멤버를 호출할 수 있다.
ex) [ Object 이름 ].[ 멤버이름 ]SingletonObject.sampleString

단점으로는

  • object 는 프로세스가 실행되자마자 생성되어 메모리에 올라가게 되는데, 이는 메모리 효율이 떨어진다.
  • 따라서 lazy 기법을 사용해서 object 내에 멤버를 사용할 때 초기화하는 메모리를 관리하기 좋은 기법이다.

개인 프로젝트

앞으로 교육 기간에 진행하게 될 팀 프로젝트를 위해 팀 빌딩을 하게 된다.
개인 프로젝트 주제 발표를 통해 앞으로의 팀 프로젝트에서 어떤 구성원이 자신의 팀에 알맞을 지
각 개개인이 어떤 팀원이 될 수 있는 지 서로 알아갈 수 있는 과정이고 이 후 팀 빌딩 과정이 진행이 된다고 하셨다...

개인 프로젝트의 주제를 정하는 것이 진짜 어려웠었다.

1. 초등, 중학생의 학습을 위한 시뮬레이션 App

첫 번째로 정했던 주제는 초등, 중학생의 학습을 위한 시뮬레이션 App 이다.
별 다른 창의적인 생각이 안 나기도 하고, 우리가 웅진씽크빅에서 교육을 받고 있으며, 웅진씽크빅의 주 서비스 대상이 초등, 중등학생이기도 한 점에서 생각해낸 프로젝트 주제이다.

먼저 문제점으로는 초등, 중학생들이 학습의욕이 저조하다 로 정의하였다.

이 사진은 비록 수학과목에 한정되어 있긴 하지만, 중학생들의 학업성취도를 나타내는 사진이다.

학습의욕 부분에서 높음 비율이 낮아지고, 낮음 비율이 올라간 것을 볼 수 있다.

해결방안 으로는 학습에 대한 동기를 불러일으키기 위해서는

첫 번째로, 초등, 중학생들이 요즈음 흥미를 가지는 요소인 게임 을 학습에 적용시키는 것이었다. 무작정 게임을 가져다 댄게 아니라 실제로 ICT 분야가 학습에 적용될 것에 대해서 많은 교사분들께서 동의하는 추세이다. 실제로 개더타운, 로블록스, 마인크래프트와 같은 메타버스를 사용한 사례들도 많다.

두 번째로는 학습에 대한 동기를 불러일으키기 위해서는 행동이 이뤄져야 하는데, 이러한 행동을 메타버스에서 시뮬레이션이라는 행위로 취하는 것이다.

그런데 이렇게 세부화하였지만, 이미 유사 서비스가 있었다..
천재교육 밀크T아이

그리고 사실, 구현 가능성도 떨어지기도 하였고, 시뮬레이션을 무작정 한다는 것이지, 더 세부화하지 못하였었다..

그래서 다른 주제로 하기로 하였다.


주제를 정하고, 세부화하는데에 다음 링크들을 참조하였다.


2. 모두의 지하철

전장연 지하철 시위에 출근길 2호선 2시간 지연...“우주선 줘야 멈출건가”

때는, 수요일이었다. 2호선을 타고 수업을 들으러 가는 길이었는데, 갑자기 타고 있었던 열차가 지연된 것이다.
신촌역에서만 20분 정도 멈춰있던 것 같고, 그 뒤로는 하나 가고 멈추고를 반복했던 것 같다. 그래서 시청역에서 내려서 약 2km를 걷고 뛰어서 부트캠프에 도착했었다. ㅋㅋ 이게 내리면 출발할 것 같고, 다른 분들도 그냥 기다리기도 하고, 버스타고 가려니 여러 번 갈아타야 하고.. 뭔가 머피의 법칙이 일어날 것만 같았다.

이런 얘기는 뒤로하고, 사실 지연되어있던 지하철 안에서 시위의 목적이 무엇인 지, 장애인분들을 위해서는 어떤 서비스를 개발하면 좋을 지 그리고 지금 지연되어 지각하게 된 나와 같은 일반인에게는 어떤 서비스가 있으면 좋을 지를 생각하다가 개인 프로젝트 주제로 정하게 되었다.

TMI )

  • 요즘 개발자 취업 준비를 하면서 어떤 앱에는 어떤 기능이 더 있었으면 좋겠고, 어떻게 개선되었으면 좋겠는 지, 어떤 서비스를 만들어내면 좋을 지 이런 생각을 많이 하게 되는 것 같다 ㅋㅋ

  • 실제 2년 전, 철도산업공모전에 참여하여 서비스 App을 개발하여 최우수상을 받았던 경험이 있어서 좀 더 관심이 쏠렸던 것 같다.


먼저, 문제점은 평소에 지하철에 느끼고 있었던 불편한 점, 개선할 점을 생각하였던 것까지 포함하여서 정의해보았다.

  • 열차의 지연 정보가 보편화되어있지 않고, 주로 사용하는 지하철 앱에서 이러한 알림 기능들이 거의 없는 경우가 많다.

  • 현재 도착한 역과 다음 역을 알려주는, 그리고 내리는 방향을 표시해주는 전광판들이 고장난 열차 칸들이 많고, 안 보일 때가 많다.

  • 이런 불편한 점들도 있고, 다른 불편한 점들에 대해서 민원신고를 할 수 있는 방법이 너무 기술적인 부분에 있어서 뒤떨어진다는 생각을 하였다.

그래서, 유사서비스를 찾아보게되었는데, 또타지하철 이라는 서울교통공사에서 제공하는 App이 가장 부합하다고 생각이 되었다.
위치서비스를 통하여 현재 역 위치 + 음성안내 , 현재 열차 칸을 식별하여 민원신고 기능에다가 + 교통 약자분들을 위한 편의시설 위치 + 보수현황 , 지연 정보 알림 까지 정말 다 갖춘 서비스였다.

하지만, 진짜 기능적으로는 완벽하지만, 완벽하지 않았다.
무슨 말이냐면, 사용자들의 관점으로 보았을 때 잘 관리되고 있지 않았었다는 말이다.

현재 역 위치 + 음성안내 는 잘 작동되는 것 같았다.

하지만 민원신고 를 하는 기능에서, 열차 칸을 식별 못하는 경우가 많았고, 편의시설 위치 + 보수현황 데이터가 최신화되어있지 않은 경우, 정보를 제공하지 않는 역이 있는 경우도 있었다.

마지막으로, 지연 정보에 대한 알림 서비스는 휼륭했지만, 알림을 눌러서 게시글을 본 후에는, 게시글을 다시 볼 수 없었다.
( 현재는 지연 정보에 대한 게시글을 다시 볼 수 있는 것 같다 !! + 서울교통공사 트위터를 참고하여도 좋다 ! )


그래서 모두의 지하철 에서는 또타지하철을 유지보수 하는 차원으로 제작해보자 하였고,
제공하는 핵심기능은 다음과 같이 나열해보았다.

  • 열차 칸을 식별하지 못하는 경우가 있으니, 최근 내가 다뤄본 QR코드를 칸 마다 배치하여 QR코드에 열차 칸의 정보를 담는 것이다.
  • 지연 정보 게시판을 운영하여, 게시글을 다시 열람할 수 있게 한다.
  • DB를 최신화한다. ( 시설 정보 )

동작방식은 파워포인트를 활용하여 간략하게 작성해보았다.


마지막 한 마디

금요일에는 그룹회고를 진행하였다. KPT 방식으로 진행하였었고, 다음 주차에는 5F 방식으로 진행해보기로 하였다.
K는 Keep의 약자로, 좋았던 점, P는 Problem의 약자로, 발생했던 문제 나빴던 점, T는 Try, 다음에 시도할 것 을 의미한다.

회고를 기준으로 정리해보면..

역량강화 첫 주차였긴 하지만,
K - 팀원들과 협업하며 많은 것들을 배울 수 있었던 시간이었다고 생각한다. 교양, 전공 지식부터 해서 협업 경험, 커뮤니케이션 경험 등 많은 것들을 배울 수 있었고,
P - 하지만 시간을 효율적으로 관리하지 못했던 것 같다. 팀 협업 부분이든, 개인 시간관리 부분이든.. 그리고 여러 전공적인 부분이든 꿀팁같은 정보 나눔이 적었었다.
T - 앞으로는 핵심적인 부분만 정리하여, 발표 준비 시간을 절약하고, 개발 공부 스터디 등을 만들어 전공 역량 강화에 좀 더 힘을 쓰고자 하기로 했다.
또한 팀 노션 페이지에 정보 공유 페이지를 만들어 퍼실리테이분들과의 면담 때 얻었던 꿀 정보 또는 전공 관련이나 여러 꿀 정보들을 공유하는 것에 대해 노력해보기로 하였다.

좀 뒤늦게 언급하지만, 솔직히 역량강화 기간 스케줄이 너무 빡세서 힘들었었는데 .. 퍼실리테이터 분들의 1:1 면담으로 앞으로의 방향성을 잡을 수 있던 점이 매우 좋았었고 , 앞으로 취업이나 학습에 있어 면담의 길이 열려있다는 점이 정말 좋았던 것 같다... 덕분에 힘이나요 !!


유데미 바로가기: https://bit.ly/3SFlXDy

유데미 STARTERS 취업 부트캠프 공식 블로그 보러가기: https://blog.naver.com/udemy-wjtb

💡 본 후기는 유데미-웅진씽크빅 취업 부트캠프 2기 - 프론트엔드&백엔드 과정 학습 일지 리뷰로 작성되었습니다.


📌 참조

profile
Yoon's Dev Blog

0개의 댓글