금요일

테크 스타트업의 조직문화


테크팀의 조직문화


  • 항상 개방적인 마인드를 갖고 협상의 여지를 두고 소통합니다.
  • 자율에는 책임이 따르므로 자율과 책임을 분리해서 일하지 않습니다.
  • 업무의 우선순위는 항상 바뀔 수 있음을 인지합니다.
  • 본인 스스로가 병목현상의 원인 제공자가 되는 걸 부끄러워 하고 책임감 있게 맡은 일을 해냅니다.
  • 회의가 필요한 경우 주최자가 사전에 안건을 참석자들에게 메일로 공유하고 구글 캘린더로 미팅 시간을 사전 조율하고 확정 하는 과정을 거칩니다.
  • 회의는 1시간 이내로 진행하며, 회의 종료 후에는 주최자가 회의록을 작성하고 회의 참석자들에게 메일로 공유합니다.
  • 온라인으로 업무 소통을 할 경우 언어적 표현으로 오해가 생길 소지를 만들지 않습니다.
  • 상호간의 업무 플로우를 존중하고자 즉시 소통이 필요한 경우 slack을 사용하고 그 외 jira를 기본으로 일합니다.

화요일

올바른 커뮤니케이션

올바른 커뮤니케이션 자세
어느 한 분야에 10년 이상 종사한 사람을 우리는 흔히 "전문가"라고 부른다.
다양한 직군들과 부대끼며 일하다보면 자연스레 "커뮤니케이션"에 상당한 시간과 비용을 소모하게 된다.
개인주의 성향이 짙은 IT업 종사자로써 팀에서만이라도 올바른 커뮤니케이션을 하려면 이런 부분을 함께 고민하고 노력해 나가야 된다.
  1. 서로간의 언어의 온도차가 있다는걸 인지한다. 이는 경험에서 오는 차이도 말한다.
말하면서 생각을 정리하는 사람과 말하기 전 자신의 언어를 정제한 후 생각을 말하는 사람과는 대화의 질이 다르다. 전자의 경우라면 고쳐야 된다. 같이 일하는 사람들을 힘들게 만든다. 반면 고민 하고 말하는 즉, 정제를 거친 생각을 말하는 사람과는 몇마디만 해보아도 금새 알게 된다. 이들과는 보다 더 의미 있는 대화를 이룰수 있다.
  1. 감정적으로 상대방에게 말하지 않는다. 감정이 앞서게 될 경우 본인이 빠르게 캐치하고 그 자리에서 바로 사과한다.
본인이 감정적으로 말하는지 모르고 계속 말하는 사람은 주로 "근데 난 뒤끝은 없어요"or"근데 난 원래 성격이 시원시원해요"라고 뒷말을 따라 붙이는 사람이다. 직장에서는 혼자할 수 있는 일은 없다. 말도 그렇다. 사과 하는 거에 대해 인색하지 말자. 이는 나를 한층 더 성숙하게 만든다. 그래도 기본은 "감정적"으로 말하면 안된다.
  1. 전문 용어, 나만 아는 용어를 남발하지 않는다. 쉬운 언어로 대화하려고 해야한다.
대부분 본인이 실제 경험한걸 가지고 얘기할 수 없는 사람들이 이런다. 실제 경험하지 못한걸 그럴싸하게 보이게 말로 포장하려하지 말자. 경험이 많은 사람일수록 쉬운 언어로 풀어서 말하는 능력을 보여준다. 거짓말은 곧 들키기 마련이다.
  1. 도움을 요청할 경우 상대방에게 구체적으로 말한다.
"나 모르겠어요"가 아닌 "코드레벨에서 중간에 예외 처리를 하다가 빠지는 경우가 있는데 이걸 어떻게 잡아내야 할지 모르겠다"와 같이 구체적으로 내가 왜 너의 도움이 필요한지를 명확히 알 수 있게 얘기한다. 적어도 내가 아니더라도 누구에게 도움을 받을수 있는지는 알려줄 수 있다.
  1. 결과에 대해 상대방에게 공유해 준다.
대화도 하고 도움도 주고 내 시간을 썼는데 그 뒤로 해결 했다는 건지 아니면 아직도 고민하고 있다는건지 피드백이 없는 사람들은 개인적으로 철저하게 차단하는 편이다. 민폐캐릭터가 되고 싶지 않다면 상황에 대해 결과에 대한 피드백은 습관이 되어야한다.

수요일

적은 리소스로 보다 더 효율적으로 일한다



  • 확장성,가변성, 효율성하는 프레임워크를 설계하는건 고되지만 프렉티스가 쌓이는걸 볼수록 언제나 흥미롭다. 정형화된 틀을 만드는게 아닌 BM이 처한 상황과 여러 유관부서 협업자들과 팀을 이뤄 하나의 목표를 위한 과정. 즉, 마일스톤을 찍어가며 성과를 내도록 끈임없이 독려하고 나아갈 비전을 제시해야 함이 더 중요하기 때문에 이로운 결과를 이루기 위한 목적 달성을 위한 수단으로 활용하고 있다. 시간이 지날수록 장이 무르익듯 프로세스도 당연히 버전업이 가능한 수준에서 설계되어야만 한다.
  • 요 근래 거쳐온 스타트업에서 10명이 넘어가다보면 부침이 생길때마다 "우리가 효율적으로 일하려면 어떤게 어떻게 해야될까?"라는 고민이 자연스레 들기 마련이다. 개발자로 시작한 10여년이 훌쩍 넘은 경력과 애자일 기반으로 설계해서 실무까지 적용했던 프로세스 사례를 먼저 일부 공유한다. 곧 다른 형태로 공유도 할 생각이다.

목요일

프로덕트매니저는 고로 존재한다

1.Tech기반 회사들은 프로젝트매니저가 존재한다

Tech기반 회사들은 프로덕트매니저가 존재한다.

테크 스타트업은 비즈니스모델이 스케일업 할수록 프로덕트매니저가 필요하게 된다.
무엇이 부족한지 알면 필요한 걸 찾아 채우면 된다.
경험상 채워도 채워도 부족한게 생기기 마련이지만 그래도 우리의 지향점은 더 나은 발전!
프로덕트매니저는 Product Manager, PM이라고 부른다.
하지만 실제로 기획자가 PM을 하는 곳도 많이 봤고
개발자가 개발PM을 하다 겸업 하는 것도 봤고
기획자, 개발자, 디자이너, 결정권자 포함 여러 이해관계자가 엮여있는 게다가 시간과 예산이 정해진 프로젝트는 어떤PM이 필요한걸까?
그간 개발자 > 개발PM > Product Manager로 경험한 내용을 추려서 나를 위해 적어볼까한다.
우선적으로 PM이 되고자 한다면 가져야 할 애티튜드는 다음과 같다고 생각한다. 팀원을 뽑을때나 나와 함께 일할 동료를 뽑을때도 많이 염두하고 있다.
  1. PM != “스페셜리스트”, PM = “제너럴리스트” is 200
단, 개발자는 언제나 스페셜리스트여야만 프로젝트가 그래도 간다.
  1. 본인이 직접 프로덕트를 개발해 보았고 개발 경험이 많은 PM is Good!
결정권자는 “아반땡을 만들어달라” 했는데 “이번에 람보르기니 우라칸 엔진을 얹어서 100km를 3초내로 끊게할께요” 라며 시간과 예산이 정해진 프로젝트의 잘못된 시작을 시도하려는 사람을 많이 보게된다. (물론 그 반대의 경우도 빈번하다.)** PM은 정성적/정량적으로 판단할 수 있는 경험과 직감, 잘 들어줄 수 있는 열린 귀, 결과를 내도록 상황을 빠르게 정리해 가며 이끌수 있는 리더쉽, 올바른 방향성에 대해 계속해서 치고 나가는 사고가 기본 탑재되어 있어야한다.** 그래서 더욱 실제 코딩을 해야 하는 개발자 입장에서 같이 들어줄수 있는 개발 경험이 기본 내장? 되어 있어야 한다.
일례로 "개발을 모르니깐 무시 당해서 인터넷으로 앱개발 교육 신청했다"라며 하소연 해 온 웹 기획자가 있었다. 응? 앱 서비스 개발 신청을 했다고? 음… 진짜 필요한건 그게 아닐거 같기도 하고 암튼 뭐라도 배우면 좋은거지!라고 답해주고 말았지만 촌스럽게 일하고 있는 곳이라는 느낌을 강하게 받았다. 뭐…
  1. 프로젝트관리기법에 대한 이론만이 아닌 실무 경험이 중요하다.
PM하면서 가장 무서운 대화의 시작이 "이슈가 있어요."라고 시작하는 대화이다. 이말인즉슨, 내가 해결해줘야 할 이슈가 생겼고 그걸 해결해줘야만 한다! 다양한 실무 경험을 토대로 빠른 판단과 실패를 줄여나가야만 한다. 이게 재밌다고 느껴야지만 PM이다. 팀장의 역할과 헷갈리지는 말자. 나중에 따로 포스트 할 예정이다
  1. 스타트업 창업 경험도 좋다.
비단 PM뿐이 아닌 공통적으로 해당 되는거 같다. PM창업가 마인드와 투자자 마인드를 동시에 갖고 있어야 한다. 업의 특성이기도 하다. 본인도 줄 곧 창업 준비해 본 경험들을 갖고 있다. 지나보면 의미를 어디에 두느냐에 따라 차이가 있겠지만 지인들과 얘기를 나눠봐도 본인 스스로도 꽤 나 많은걸 느끼게 해준다. 현실을 알게 되거나 아니면 나처럼 더욱 가열차게 미래를 그리게 되거나…

토요일

skb머큐리 관리자 사이트 접속

개인 사이트를 NAS에 올릴려고 하다 라우터 설정도 브릿지모드로 바꿔야 됐다.

http://192.168.25.1/main.asp 접속하면
머큐리 관리자 사이트 접속이 됨.
계정 : admin
비번 : skb모뎀 하단에 유선 MAC 맨 뒷자리 "6자리_admin"이며 대소문자 구분하고 숫자외에 영어가 들어가면 그대로 써줌
모든 skb공유기 공통임

asua 공유기 초기화 방법

공유기 설정을 잡다가 AP모드를 킨 후 접속이 제대로 안되는 문제로 초기화 진행함
우선 앱 스토어에서 "ASUS Router"앱을 먼저 받아두고 아래 절차대로 진행 했을때 빠르게 공유기 설정을 다시 잡을수 있었음.
  1. 공유기 전원 버튼을 눌러서 전원 끔
  2. WPS버튼을 누른체로 전원을 다시 켬
  3. WPS버튼을 계속 누른체로 전원이 켜지고 램프가 정상적으로 들어오는걸 확인
  4. WPS버튼에서 손을 뗀 후 라우터 부팅이 제대로 된걸 확인
  5. 디바이스에서 Wifi 켬
  6. 기본으로 ASUS_2G 라우터가 보안이 안 걸린체로 뜸. 현재 아무나 다 우리집 공유기를 접속해서 쓸 수 있는 상황이 벌어지고 있는것
  7. ASUS Router 앱 접속하여 안내대로 그대로 진행하면 됨. 한글 번역이 좀 아쉽긴 해도 진행 하는데 문제가 될 부분은 없었음. or  wifi켠 채로 http://router.asus.com/Main_Login.asp 한글로 환경설정 가능함

수요일

aws ec2 파일질라 연결

파일질라를 통한 AWS EC2 접속

내가 하고 있는 프로젝트 테스트서버로 AWS에 올릴라고 알아보다가 쓰는 포스팅(인터넷에 잘못된 정보가 너무 많다 후...)

mac 쓰는 분들은 .ppm 파일 그대로 사용해도 됨
제목으로 구글링해보면 대부분 ppk 파일 넣어야 되는걸로 시작하는 포스팅들 뿐인데 putty 안 쓰는 사람은 굳이 이렇게 할 필요 없고 ppk 파일 만들려고 시간 허비할 필요 없음
aws ec2 서버 생성 후 pem 파일이 있어야 되는게 전제 조건임
  1. 파일질라 실행 > 상단 메뉴 편집 > 설정 클릭
    enter image description here
  2. 빨간 박스 접속관리자 실행
    enter image description here
  3. 접속 정보 설정 (호스트 및 사용자 및 비밀번호 입력 하면 됨)
    enter image description here
ec2 접속 후 파일 업로드 실행 시 권한 없음으로 파일 업로드가 안되는 경우 발생. 터미널로 권한 추가 후 재 시도하면 파일 업로드 정상적으로 됨. 터미널로 ec2 접속 후 다음 명령어 순차적으로 실행
  • sudo su
  • chmod -R 777 “폴더명”

ec2 brew 설치

  1. ec2 터미널 접속
  2. 우분투를 설치했음으로 다음 명령어 순차적으로 실행

syntaxerror: non-ascii character '\xec' in file 해결방법

syntaxerror: non-ascii character '\xec' in file 파이썬 코드 내 한글이 들어가서 발생되는 문제 인코딩 타입을 선언 코드 맨 첫줄에 # -*- coding: utf-8 -*- 넣으면 됨

월요일

홀스티 선언문

이것이 당신의 인생이다. 당신이 사랑하는 일이 있다면 자주 그것을 하라.
마음에 들지 않는 일이 있다면 바꿔라. 직업이 마음에 들지 않는다면 그만둬라.
시간이 충분하지 않다면 텔레비전을 꺼라. 삶의 반려자를 찾아 헤매고 있다면 멈춰라.
당신이 사랑하는 일을 시작할 때 그들은 당신을 기다리고 있을 것이다.
지나친 분석은 그만둬라. 삶은 단순하다. 모든 감정은 아름답다.
음식을 먹을 때는 마지막 한 입까지 감사하라.
새로운 일, 새로운 사람들에게 마음과 두 팔, 가슴을 열어라.
우리는 서로의 다름 안에서 하나로 이어져 있다.
옆에 있는 사람에게 열정에 대해 묻고 당신의 꿈과 영감을 그들과 함께 나눠라.
자주 여행하라. 길을 잃는 것이 너 자신을 찾도록 해줄 것이다.
어떤 기회는 단 한번만 온다. 그것을 붙잡아라.
인생은 당신이 만나는 사람들과 함께 당신이 만들어 가는 것이다. 그러니 나가서 창조적인 일을 시작하라. 

인생은 짧다. 당신의 꿈을 살고, 당신의 열정을 나눠라

금요일

The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

The superclass “javax.servlet.http.HttpServlet” was not found on the Java Build
Path
해결방법 : 프로젝트 마우스 우 클릭 -> Build Path -> Configure Build Path -> 세번째 탭 Libraries -> 우측 네번째 Add Library 클릭 -> server runtime ->선택 후 Apply 하면 해결 됨

failed to create the java virtual machine

-vm
C:\jdk1.6.0_12\jre\bin\javaw.exe
-startup
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
–launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502
-product
org.eclipse.epp.package.jee.product
–launcher.defaultAction
openFile
–launcher.XXMaxPermSize
128M
-showsplash
org.eclipse.platform
–launcher.XXMaxPermSize
128m
–launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx512m
첫번째 빨간 박스 이클립스 설치 한 폴더를 지정해주고 그뒤로는 디렉토리 찾아가 보면 나온다.
두번재 세번째는 256으로 설정된 값을 128로 바꿔주면 된다. 나머지는 손 댈께 없음.

jsp session login

-로그인 폼

로그인
-session_chk.jsp
<%@ page contentType=“text/html;charset=UTF-8” %>
<%
String id = request.getParameter(“txt_id”);
String pw = request.getParameter(“txt_pw”);
if(id != null && id.equals(“admin”) && pw != null && pw.equals(“1111”)){
session = request.getSession(true);
session.setAttribute(“id”,“admin”);
session.setAttribute(“pw”,“1111”);
response.sendRedirect(“recipe_list.jsp”);
}else{
response.sendRedirect(“login.jsp”);
}
%>
페이지 상단마다 아래 코드 삽입.
<%
String sessionid = (String)session.getAttribute(“id”);
boolean sessiondecide = sessionid == null ? false : true;
if(sessiondecide == false){
/******************************************
세션 객체가 없다면 최초 로그인 페이지로 되돌린다.
*******************************************/
response.sendRedirect(“login.jsp”);
return;
}
%>
로그아웃
<%@ page contentType=“text/html; charset=utf-8”%>
<%
session.invalidate();
response.sendRedirect(“login.jsp”);
%>

mssql sp

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
/----------------------------------------------------------------------------------------------
1.Stored Procedure : [up_tblboard]
2.관련 Table : tblboard
3.내용 : 글 쓰기 처리 저장 프로시져
4.작성자 : 투이아빠
5.작성일 : 2009.03.19
-----------------------------------------------------------------------------------------------
/
ALTER PROCEDURE [dbo].[up_tblboard]
@idx INT --글번호
,@name VARCHAR(50)
,@password VARCHAR(50)
,@email VARCHAR(50)
,@title VARCHAR(50)
,@contents TEXT
,@readcount INT --카운트
,@WebPath VARCHAR(200) --파일
AS
SET NOCOUNT ON
DECLARE @error INT --에러선언
– 격리 수준을 최소로 설정
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRAN
INSERT tblboard(
idx, name, pass, email, title, contents, readcount, filename
)VALUES(
@idx, @name, @password, @email, @title, @contents, @readcount, @WebPath
)
SELECT @error = @error + @@ERROR
–시스템 함수 @@error를 써서 에러 처리를 해주는 부분
if @error = 0 or @error IS NULL
begin
SELECT ‘성공’ AS result, null AS message, null as error_code
COMMIT TRAN
end
else if @error <> 0
begin
SELECT ‘실패’ AS result,‘글쓰리 처리 작업중에 에러 발생’ AS message, ‘01’ AS error_code
–트랜잭션을 rollback
ROLLBACK TRAN
end
SET NOCOUNT OFF
– 격리 수준을 원상 복구
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

fql.query test

[http://developers.facebook.com/docs/reference/rest/fql.query/
graph api 테스트는 여기서
](http://developers.facebook.com/docs/reference/rest/fql.query/)https://developers.facebook.com/tools/explorer/?method=GET&path=510995753

Google Charts


function drawChart() { //DB연동 데이터 꽂는 부분
var data = google.visualization.arrayToDataTable([
[‘company’, ‘adOn’, ‘adOff’],
[‘medialink’, <?=$'otalCnt?>, <?=$'otalCnt?>]
]);
var options = {
title: ‘타이틀명 달고’,
Axis: {title: ‘Year’, titleTextStyle: {color: ‘red’}}
};
var chart = new google.visualization.ColumnChart(document.getElementById(‘chart_div’));
//각종 챠트 ui 방식에 대한 구글 샘플 https://google-developers.appspot.com/chart/interactive/docs/gallery/candlestickchart
chart.draw(data, options);
}

mssql @@ERROR=0 이란?

“시스템함수”

@@ERROR=0 오류없음

@@ERROR=0 오류없음

@@ERROR=0 오류없음

예문)

if @error = 0 or @error IS NULL
begin
SELECT ‘성공’ AS result, null AS message, null as error_code
COMMIT TRAN
end
else if @error <> 0
begin
SELECT ‘실패’ AS result,‘성적처리 에러’ AS message, ‘01’ AS error_code
–트랜잭션을 rollback
ROLLBACK TRAN
end

mssql 테이블 스캔과 넌클러스터드인덱스의 차이

mssql 동일한 db 서버 상 서로 다른 테이블간 update

update 테이블명1
set 테이블명1.조건코드 = 복사해올테이블.신규조건코드
from 복사해올테이블
where 테이블명1.조건코드 = 복사해올테이블.복사될 테이블과의 매칭코드
and 복사당할테이블.조건 = ‘’

동일한 컬럼과 데이터값을 가진 테이블 insert

nsert into 대상A (
select절과 같은 필드1, select절과 같은 필드2, select절과 같은 필드3

)SELECT insert절과 같은 필드1, insert절과 같은 필드2, insert절과 같은 필드3 from 대상 B
where – 조건절로 원하는 값만 가져옴

대상B에 있는 데이터를 대상A로 복사한다.