Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

Nonamed Develog

[TIL] AI 웹 개발 7기 사전 캠프 1-4 본문

WHAT I LEARN/TIL

[TIL] AI 웹 개발 7기 사전 캠프 1-4

노네임드개발자 2024. 5. 23. 16:24

[데일리미션] 아티클 스터디

오늘의 아티클: 10배 이상 뛰어난 개발자가 되는 법

https://yozm.wishket.com/magazine/detail/1373/

 

10배 이상 뛰어난 개발자가 되는 법 | 요즘IT

여러분은 어떤 개발자인가요? 최고의 개발자는 평범한 개발자보다 실제로 10배 이상 뛰어납니다. 초급 개발자로 구성된 팀 하나보다 10x 개발자가 더 빠른 결과물과 더 많은 가치를 제공합니다.

yozm.wishket.com

 

아티클 핵심 내용 요약

필자는 10배 이상 뛰어난 개발자와 같이 일해볼 기회가 있었는데 그 개발자는 다음에 해당 되지 않았다.

  • 남들보다 10배 빠른 타이핑 속도
  • 남들보다 10배 더 많이 일하기
  • 남들보다 10배 많은 코드 짜기

오히려 남들보다 절반의 타이핑 속도, 업무량, 코드 작성보다 코드 삭제하는데 더 많은 시간을 할애했다.

 

최고의 엔지니어는 올바른 도구를 사용하고 올바른 질문을 하며 우선순위를 정하는 방법을 알고 있다.

이렇듯 최고의 엔지니어와 평벙한 엔지지니어를 구분 짓는 것은 놀랍게도 비기술적인 부분이다.

 

초급 개발자가 흔히 저지르는 3가지 실수와 경험 많은 개발자들의 동일 문제를 어떻게 다루는지 알아보자.

 

1. 사용하는 도구에 대한 연구가 없음

"나에게 나무를 베는 데 8시간이 주어진다면 도끼를 가는 데 7시을 쓸 것이다" 라는 에이브러햄 링컨의 말을 기억하자.

초급 개발자의 흔한 실수는 무작정 코딩부터 시작한다는 것이다. 다른 대안을 찾는데 시간을 투자한다면 코드 한 줄 없이 문제를 해결할 수 있는데 말이다.

 

10배 이상 뛰어난 개발자(10x 개발자)는 초급 개발자가 몇 주동안 완성할 일을 올바른 도구를 사용하여 10분 만에 완료할 수 있다.

 

2. 도움을 요청하지 않음

초급 개발자는 10x 개발자가 마치 고독한 천재 같다는 착각을 한다. 하지만 10x 개발자 또한 필요할 때 다른 사람의 도움을 받는다. 초급 개발자는 스스로 상황을 판단하는 정보를 해석할 능력이 부족하기에 자신이 작성한 코드에 대한 고민보다는 주변 동료에게 질문하는 것이 좋다. 도움을 구하는 것을 두려워하지 말자!

 

3. 비지니스 가치를 제공하지 않음

10x 개발자는 현명한 투자자이다. 이들은 기회비용을 잘 이해하고 있으며 투입한 시간보다 투자에 대한 보상이 더 커야한다고 생각한다. 그들은 코드는 비지니스 목표를 수단으로 이해한다. 하지만 초급 개발자들은 비지니스 목표를 간과하는 경우가 있다.

초급 개발자가 수익 창출과 무관한 기능 구현에 2시간을 낭비하고 10x 개발자는 5배의 수익을 내는 코드 변경에 1시간 투자한다면 10배의 생산성 차이가 난다.

 

개발자는 소프트 스킬이 매우 중요하다. 노력이 자존심 때문에 물거품이 되지 않게 주의하자.

 

 

일일 알고리즘 코드카타 풀어보기

Q. 머쓱이는 선생님이 몇 년도에 태어났는지 궁금해졌습니다. 2022년 기준 선생님의 나이 age가 주어질 때, 선생님의 출생 연도를 return 하는 solution 함수를 완성해주세요.

def solution(age):
    answer = 2022 + 1 - age
    return answer

 

파이썬 문법 기초 2주차 강의

 

2-4 예외 처리

try-except 예제

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

for person in people:
    if person['age'] > 20:
        print(person['name'])

만약에 person에 age가 20보다 크면 name의 print

 

만약에 바비에 딕셔너리에 age가 없을 때

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby'},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

for person in people:
    if person['age'] > 20:
        print(person['name'])

carry
ben

error

이럴 때 try except(예외 처리)를 쓴다. 

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby'},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

for person in people:
    try:
        if person['age'] > 20:
            print(person['name'])
    except:
        print(person['name'], '에러입니다.')

carry
ben
bobby 에러입니다.
red
queen

try를 실행하는 동안 에러가 날 때 except를 대신 실행

 

주로 서버에 문제가 있을 시 서버에 콜을 할 때 사용한다.

하지만 남용시 사후 정리가 어렵기 때문에 잘 안쓰도록 하자.

 

2-5 파일 불러오기

 

main_test.py: 뼈대가 되는 파일

main_func.py: 복잡한 함수를 넣는 파일 

def say_hi():
    print('안녕!')

def say_hi_to(name):
    print(f'{name}님 안녕하세요')

main_func.py에 함수를 입력하고

(f-string 응용했으니 참고)

from main_func import *

say_hi()
say_hi_to('영수')

main_test.py에 from main_func improt *를 입력하면 그대로 사용 할 수 있다.

from main_func import say_hi_to

say_hi_to('영수')

say_hi_to 만 불러 올 수 있다. 이럴 땐 * 대신 say_hi_to 를 입력하면 된다.

 

2-6 한줄의 마법

 

파이썬 이용자 중 한줄로 줄여쓰는 경우가 있다.

1. if문 - 삼항연산자

num = 3

if num % 2 == 0:
    print('짝수')
else:
    print('홀수')

이렇게 할 수 있는데

num = 3

if num % 2 == 0:
    result = '짝수'
else:
    result = '홀수'

print('3은 홀수입니다')

이렇게 만들고 싶을 때 f-string을 사용해보자

num = 3

if num % 2 == 0:
    result = '짝수'
else:
    result = '홀수'

print(f'{num}은 {result}입니다')

이렇게!

num = 3

result = ('짝수' if num & 2 == 0 else '홀수')

print(f'{num}은 {result}입니다')

간단하게 한줄로 쓰면 이렇게 된다. 꽤 직관적이다. result에 ()가 없어도 된다.

 

2. for문 - 한방에 써버리기

상황) A_list = [1,3,2,5,1,2]의 배수를 만들 때

a_list = [1,3,2,5,1,2]

b_list = []

for a in a_list:
    b_list.append(a*2)

print(b_list)

이렇게 할 수 있다. b_list를 채울때 a_list의 x2를 계속 추가한다.

a_list = [1,3,2,5,1,2]

b_list = [a*2 for a in a_list]

print(b_list)

간단하게 할 수 있다.

a_list에 있는 a를 돌릴 때 마다 a*2를하고 나온 값을 list 하라.

 

여기서부터는 어려우니 나중을 위해 듣는다고 생각하자.

 

2-7 map, filter, lambda식

 

1. map - 리스트의 모든 원소를 조작하기

map를 이용하여 리스트를 하나씩 돌면서 20보다 크면 성인 아니면 청소년으로 바꿔보자.

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

def check_adult (person):
    if person['age'] > 20:
        return '성인'
    else:
        return '청소년'

result = map(check_adult, people)
print(list(result))

여기서 result를 list로 감싸거나 map을 list로 감싸줘야 한다.

map은 people을 하나하나 돌면서 check_adult에다 넣어라 그리고 그 결과값을 리스트로 묶은 것.

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

def check_adult (person):
    return '성인' if person['age'] > 20 else '청소년'

result = map(check_adult, people)
print(list(result))

이렇게 간단하게 바꿀 수도 있다.(한줄의 마법)

 

여기서 lambda x: x, 식이 나온다.

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

result = map(lambda person: '성인' if person['age'] > 20 else '청소년', people)

print(list(result))

people을 하나씩 돌면서 person에다가 넣을 건데 그 person을 가지고

'성인' if person['age'] > 20 else '청소년'

이렇게 return 해라.

 

2. filter - 리스트의 모든 원소 중 특별한 것만 뽑기

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

result = filter(lambda person: person['age'] > 20, people)

print(list(result))

people에서 person의 20보다 큰 애들만 뽑아라

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

result = filter(lambda x: x['age'] > 20, people)

print(list(result))

하지만 lambda 식을 쓸때는 x: x 라고 써야한다.(관용적으로)

 

2-8 함수 심화

함수의 매개변수

직접 쓸 일은 거의 없다. 라이브러리를 쓸때나 직접 코드를 볼 때 익숙해지기 위해 배워보자

def cal(a,b):
    return a+2*b

result = cal(b=2,a=1)
print(result)

5/ 식과 같이 b=2, a=1라고 지정하면 순서대로 쓰지 않아도 된다.

def cal(a,b=2):
    return a+2*b

result = cal(1)
print(result)

5/ b=2를 고정하고 a에만 입력을 하면 b가 입력한 것과 같이 결과가 나온다.

def cal(a,b=2):
    return a+2*b

result = cal(1,3)
print(result)

7/ b값을 넣어주면 대입해서 결과가 나오지만 넣어주지 않고 기본값을 설정하면 기본값 대로 결과가 나온다.

def cal(*args):
    for name in args:
        print(f'{name} 밥먹아라~')

cal('영수','철수','영희')

args: 변수(인자)를 무제한으로 넣을 수 있다.

 

키워드 인수를 여러개 받는 방법

def cal(**kwargs):
    print(kwargs)

cal(name='bob',age=30,height=180)

→{'name': 'bob', 'age': 30, 'height': 180}

딕셔너리로 쓸 수 있게 만들어 준다. 

 

라이브러리의 코드를 확인할 때 많이 볼 수 있다,

 

2-9 클래스

 

우선 클래스는 언제 사용하는지 아는게 매우 중요하다!

 

객체지향적?

class Monster():
    hp = 100
    alive = True

    def damage(self, attack):
        self.hp = self.hp - attack
        if self.hp < 0:
            self.alive = False

    def status_chsck(self):
        if self.alive:
            print('살았다')
        else:
            print('죽었다')

m1 = Monster()
m1.damage(150)
m1.status_chsck()

m2 = Monster()
m2.damage(90)
m2.status_chsck()

죽었다
살았다

자체적으로 status르 관리할 수 있다.

monster: class 이름

m1, m2: 인스턴스 (몬스터 한마리라고 생각하는게 편하다)