반응형
반응형

10년 차 PM이 '관리자'라는 타이틀을 버리고 'Product Architect'가 된 이유

 

AI가 코딩하고 디자인하는 시대, "일정 조율하고 리소스 관리하는" 전통적인 PM의 역할은 유효할까요?

2026년 새해를 맞아, 지난 10년간 저를 정의했던 PM(Product Manager)이라는 껍질을 깨고 'Product Architect'로 역할을 재정의했습니다. 단순히 이름만 바꾼 것이 아닙니다. 일하는 방식과 툴, 관점을 완전히 뜯어고쳤습니다.

'AI 시대 생존을 위한 3가지 원칙'을 공유합니다.

  1. 고정관념 깨기: "조율할 대상이 사라졌다"

여전히 개발자, 디자이너 사이를 조율하는 게 PM의 일일까?
AI 시대엔 직접 만들고 책임지는 사람이 가장 안전합니다.

  1. 방식 바꾸기: "익숙한 것이 가장 비효율적이다"
  • 기획서 쓰고 -> 디자인 넘기고 -> 개발 기다리는 '선형적 프로세스'의 종말.
  • 이제 Replit으로 기획과 동시에 구현하고, Snapdeck으로 10분 만에 제안서를 만듭니다.
  1. 재정의하기: "Manager에서 Architect로"
  • 매니저(Manager)로 정의하면 '관리할 일'만 생깁니다.
  • 아키텍트(Architect)로 정의해야 '설계할 가치'가 보입니다.

더 이상 '성실한 관리자'는 정답이 아닙니다. 변화하는 시대, 여러분은 스스로를 무엇으로 정의하고 계신가요?

 

 

 

https://maily.so/insightlog/posts/1gz2796xr3q

 

2026년, 저는 PM이라는 직함을 버리기로 했습니다.

고정관념, 방식, 그리고 업의 재정의에 대하여

maily.so

 

반응형
반응형

소프트웨어 개발의 미래는 소프트웨어 개발자들이다 

https://news.hada.io/topic?id=25448

  • 수십 년간 반복된 “프로그래머의 종말” 예언은 매번 틀렸으며, 기술 발전은 오히려 더 많은 개발자와 프로그램의 증가로 이어져 왔음
  • WYSIWYG, 4GL, No-Code, LLM 등 다양한 자동화 기술이 등장했지만, 실제로는 개발자의 필요성을 줄이지 못했음
  • LLM 기반 도구는 과거 기술보다 신뢰성과 유지보수성이 떨어지며, 대부분의 팀에서 생산성 저하와 품질 악화를 초래함
  • 프로그래밍의 본질적 어려움은 코드 작성이 아니라 인간의 모호한 사고를 논리적으로 변환하는 능력에 있으며, 이는 여전히 인간의 영역임
  • 따라서 AI가 개발자를 대체할 가능성은 낮고, 오히려 숙련된 개발자에 대한 수요가 더 커질 전망임

반복되는 “프로그래머의 종말” 주기

  • 지난 43년간 Visual Basic, Delphi, Executable UML, No-Code, Low-Code 등 다양한 기술이 프로그래머의 필요성을 없앨 것이라 주장되어 왔음
    • 1970~80년대에는 4GL, 5GL, 그 이전에는 Fortran, COBOL, 더 거슬러 올라가면 컴파일러 A-0조차 같은 예언을 받았음
    • 초기 전자식 컴퓨터 COLOSSUS는 물리적 배선으로 프로그래밍되었으며, 이후 세대가 “진짜 프로그래머가 아니다”라 조롱받기도 했음
  • 그러나 결과적으로는 프로그래머 수가 줄지 않고 오히려 증가, 이는 Jevons Paradox의 대표적 사례로 언급됨

LLM과 과거 기술의 차이

  • 과거 기술은 실제로 소프트웨어 생산 속도를 높이고 신뢰성도 확보했지만, LLM은 대부분의 팀에서 반대 효과를 보임
    • LLM은 코드 품질을 낮추고 유지보수를 어렵게 만들어 “LOSE-LOSE” 상황을 초래함
    • 동일한 프롬프트로도 동일한 결과를 내지 못하며, 생성된 코드에는 인간 개발자의 검증과 수정이 필수적임
  • AI가 개발자를 대체한다는 증거는 없음, 최근 인력 감축은 팬데믹 시기 과잉 채용, 금리 상승, 데이터센터 투자 집중 등 경제 요인 때문임

프로그래밍의 본질적 난제

  • 프로그래밍의 핵심은 인간의 모호한 사고를 논리적으로 정밀한 계산 사고로 전환하는 과정임
    • 이는 천공카드 시절부터 COBOL, Visual Basic, Python에 이르기까지 변하지 않은 어려움임
  • 자연어는 본질적으로 모호하고 비정확하기 때문에, 영어나 프랑스어로 프로그래밍하는 시대는 오지 않을 것이라 Dijkstra의 예언을 인용함
  • 이러한 사고방식을 배우는 것은 가능하지만, 모두가 즐기거나 잘할 수 있는 일은 아니며, 숙련된 인력의 공급은 항상 부족함

AI의 한계와 지속 가능성

  • AGI(범용 인공지능) 은 여전히 멀리 있으며, 인간 수준의 이해·추론·학습 능력이 필요함
  • 대규모 LLM은 막대한 비용과 손실을 초래하고 있어 장기적으로 지속 가능하지 않음
    • 시간이 지나면 모델이 학습한 언어·라이브러리 버전의 제약으로 인해 활용성이 떨어질 가능성 있음
    • 이러한 이유로 초대형 LLM은 ‘Apollo 달 탐사’처럼 비경제적 실험으로 남을 수 있음

미래의 개발 환경 전망

  • 가까운 미래의 소프트웨어 개발은 소규모 언어 모델 기반의 보조 도구가 프로토타입 생성이나 코드 자동완성 등 보조 역할을 수행하는 형태로 예상됨
  • 그러나 중요한 결정과 품질 확보는 인간 개발자가 주도하며, Jevons의 법칙에 따라 개발자 수요는 오히려 증가할 가능성 있음
  • 기업은 지금부터 숙련된 개발자 채용과 교육에 투자해야 하며, 이는 AI 유무와 관계없이 생산성과 신뢰성을 높이는 핵심 전략
반응형
반응형

Google에서 14년간 얻은 21가지 교훈 (addyo.substack.com)

https://addyo.substack.com/p/21-lessons-from-14-years-at-google

 

21 Lessons from 14 Years at Google

On code, careers, and the human side of engineering

addyo.substack.com

💡 뛰어난 엔지니어의 통찰: 코드 너머의 성공 전략 요약

제시해 주신 내용은 '코드' 자체의 영리함보다는 사용자 문제 해결, 팀 정렬, 조직 운영, 그리고 장기적인 경력 설계에 초점을 맞춘, 선임 엔지니어의 핵심 역량에 대한 깊은 통찰을 담고 있습니다.

핵심 주제와 통찰을 4가지 범주로 나누어 요약 정리했습니다.


1. 👥 팀 협업 및 정렬 (사람과 정치)

뛰어난 엔지니어링은 기술 문제가 아닌, 사람과 조율의 문제입니다.

  • 함께 옳음에 도달하기: 기술 논쟁에서 이기는 것보다 함께 문제 정렬을 이루는 것이 진짜 업무입니다. '강한 의견, 약한 집착'의 태도로 타인을 위한 공간을 창출해야 합니다.
  • 정렬 실패가 속도 저하의 주범: 대규모 조직에서 팀이 느려지는 주된 원인은 실행 부족이 아니라 정렬 실패입니다. 선임 엔지니어는 코드를 빨리 작성하는 것보다 방향, 인터페이스, 우선순위 명확화에 시간을 투자해야 합니다.
  • 영향력의 가시화 (코드 너머의 옹호): 훌륭한 코드는 스스로 말하지 않습니다. 관리자와 동료가 당신을 옹호하도록 가치 사슬을 모두에게 읽기 가능하게 만드는 노력이 필요합니다.

2. ✨ 코드 품질 및 명확성 (기술적 통찰)

코드의 영리함은 오버헤드일 뿐이며, 명확성이 운영 리스크를 줄입니다.

  • 명확성이 시니어의 징표: 코드는 장애 중 새벽 2시에 유지보수할 낯선 사람들을 위한 전략 메모이므로, 영리함 대신 명확성을 최적화해야 합니다.
  • 최고의 코드는 작성하지 않은 코드: 시스템 개선은 추가보다 삭제에서 오는 경우가 많습니다. 디버깅, 유지보수, 설명할 필요가 없는 코드가 최고의 코드입니다.
  • 새로움은 빚: 기술 선택을 작은 '혁신 토큰' 예산으로 다루어야 합니다. 혁신으로 보상받는 곳에서만 혁신하고, 나머지는 알려진 실패 모드를 가진 지루한(표준적인) 기술을 기본값으로 삼아야 합니다.
  • 추상화의 한계: 모든 추상화는 복잡성을 제거하는 것이 아니라 당신이 온콜일 때로 이동시키는 것일 수 있습니다. 추상화가 실패할 때를 대비해 스택의 기본 실패 모드에 대한 작동 모델을 유지해야 합니다.

3. 🎯 사용자 문제 해결 및 출시 전략

사용자 문제 해결에 집착하고, 완벽 대신 행동을 우선시해야 합니다.

  • 사용자 문제에 집착: 최고의 엔지니어는 기술부터 적용처를 찾는 대신, 사용자 문제를 깊이 이해하고 거기서 솔루션을 도출합니다. 근본에 도달할 때까지 "왜"를 질문해야 합니다.
  • 행동 편향을 가지고 출시: 완벽 추구는 마비를 초래합니다. **"먼저 하고, 제대로 하고, 더 잘하는 순서"**로 진행하여 현실과의 접촉에서 완벽한 솔루션을 발견해야 합니다. 추진력이 명확성을 만듭니다.
  • 버그조차 의존성: 충분한 사용자가 있다면 모든 관찰 가능한 동작(버그 포함)이 의존성이 됩니다. 호환성 작업(API 은퇴)은 곧 제품 유지보수이며, 시간과 공감을 들여 마이그레이션으로 설계해야 합니다.

4. 📈 경력 및 조직 운영 (장기적 관점)

경력은 의도적으로 설계해야 하며, 조직 운영의 함정을 경계해야 합니다.

  • 측정 지표의 함정: 측정이 목표가 되면 게임화되어 왜곡됩니다. 선임 엔지니어는 속도 지표와 함께 품질/리스크 지표를 쌍으로 제시하고, 통찰 해석을 주장해야 합니다.
  • 모르는 것을 인정하기: '모르겠습니다'라고 말하는 것은 약함이 아니라 허가를 창출합니다. 리더가 불확실성을 인정해야 팀 전체가 학습하고 문제 회피를 막을 수 있습니다.
  • 시간은 돈보다 가치 있는 자원: 경력이 쌓일수록 시간은 재생 불가능한 자원이 되므로, 무엇을 교환하고 있는지 알고 의도적으로 경력을 설계해야 합니다.
  • 네트워크의 복리: 네트워크는 당신이 가질 모든 직장보다 오래 지속됩니다. 거래적이 아닌 호기심과 관대함으로 관계에 투자하는 것이 장기적인 경력 복리 이자를 만듭니다.

 

 

 

반응형
반응형

[DB] NULLIF 함수 , 주요 사용 사례 (NULLIF + COALESCE)

 

NULLIF의 주된 목적은 데이터를 NULL로 표준화하여 다른 COALESCE나 IS NULL과 같은 함수와 결합해 사용하는 데 있습니다.

SELECT
    ProductName,
    COALESCE(
        NULLIF(ProductName, ''),  -- ProductName이 ''이면 NULL을 반환
        '정보 없음'              -- NULL이 되면 '정보 없음'으로 대체
    ) AS StandardizedName
FROM
    Products;

 

ProductName 컬럼에 NULL 또는 **빈 문자열('')**이 들어있을 때, 이를 '정보 없음'으로 통일하여 표시하고 싶을 때 사용합니다.

 

튜닝 및 조언 💡

  • 가독성: CASE WHEN A = B THEN NULL ELSE A END 구문을 대체하는 간결한 방식으로, 쿼리의 가독성을 크게 높여줍니다.
  • NULL 처리의 표준화: NULLIF는 데이터 정제 및 ETL(Extract, Transform, Load) 프로세스에서 특정 "표준 무효 값" (예: -99, 'N/A', 'NA')을 데이터베이스의 표준 NULL 값으로 변환하는 데 매우 유용합니다.
반응형
반응형

삼성 인터넷을 PC에서 사용해 보세요!  https://browser.samsung.com/beta

 

https://developer.samsung.com/dashboard/partner/SamsungInternet/mek9zgpma197tn6k/dsqw1pwsjb

 

https://developer.samsung.com/login?redirectURL=/dashboard/partner/SamsungInternet/mek9zgpma197tn6k/dsqw1pwsjb

 

developer.samsung.com

반응형
반응형

입력된 웹 페이지 내에서 모든 <img> 요소를 추출하는 프로그램을 **requests**와 BeautifulSoup 라이브러리를 사용하여 구현해 드리겠습니다. 🔎

이 방법은 웹 크롤링(Web Crawling)의 가장 기본적인 형태이며, HTML을 파싱(Parsing)하여 원하는 특정 태그를 쉽게 찾아낼 수 있습니다.

 

_image_resource_extract.py

 

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
import sys

def extract_images_from_url(url):
    """
    주어진 URL의 웹 페이지에서 모든 <img> 태그의 src 속성을 추출합니다.
    
    :param url: 분석할 웹 페이지의 URL
    :return: 이미지 URL 리스트
    """
    if not (url.startswith('http://') or url.startswith('https://')):
        # 사용자가 프로토콜을 생략했을 경우 https://를 기본으로 추가
        url = 'https://' + url
        
    image_list = []
    
    print(f"URL에 접속 중: {url}")
    
    try:
        # 1. HTTP 요청 보내기
        # User-Agent를 설정하여 봇 접근이 아님을 알리고 접속 거부를 방지합니다.
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status() # HTTP 오류가 발생하면 예외 발생
        
        # 2. HTML 파싱 (BeautifulSoup 사용)
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # 3. 모든 <img> 태그 찾기
        img_tags = soup.find_all('img')
        
        # 4. 각 태그에서 src 속성 추출
        for img in img_tags:
            src = img.get('src')
            if src:
                # 5. 상대 경로를 절대 경로로 변환
                # <img src="/images/logo.png">와 같은 상대 경로를 처리하기 위해 필요합니다.
                absolute_url = urljoin(url, src)
                image_list.append(absolute_url)
                
    except requests.exceptions.RequestException as e:
        print(f"\n[오류] 웹 페이지에 접속할 수 없습니다: {e}")
        return None
    except Exception as e:
        print(f"\n[오류] 예상치 못한 오류가 발생했습니다: {e}")
        return None
        
    return image_list

if __name__ == "__main__":
    
    # 1. 사용자로부터 URL 입력 받기
    target_url = input("이미지 리스트를 추출할 웹 페이지 URL을 입력하세요 (예: google.com): ").strip()
    
    if not target_url:
        print("URL이 입력되지 않았습니다. 프로그램을 종료합니다.")
        sys.exit()

    # 2. 이미지 추출 실행
    images = extract_images_from_url(target_url)

    # 3. 결과 출력
    print("\n" + "="*50)
    
    if images is not None:
        print(f"📌 발견된 이미지 요소 개수: {len(images)}개")
        print("--- 추출된 이미지 URL 리스트 ---")
        
        # 최대 10개만 출력 (너무 길어지는 것을 방지)
        for i, img_url in enumerate(images[:10]):
            print(f"{i+1}. {img_url}")

        if len(images) > 10:
            print(f"...\n(총 {len(images)}개의 이미지 URL이 발견되었습니다.)")
    
    print("="*50)
반응형

+ Recent posts