[펌] 스타트업 기업의 탑룰 10

 스타트업 기업의 TopRule 10
by Bob Norton

스타트업 기업은 의사결정이 좀더 신속하게 이루어져야 하며, 감수해야 하는 위험은 훨씬 커야 하며, 개발 되는 솔루션은 아직 미완의 완성도(70~80%)를 갖고 있으며, 타겟시장은 좀더 좁게 설정되어져야만 한다. 또한 스타트업기업은 신속하게 디자인되고 출발되어야 하며, 그리고 높은 수준이면서 매우 다양한 범위의 고객 피드백을 받아야 하며, 이에 따라 끊임없이 수정하고 변화시켜야 한다. 이는 마치 가장 최신의 열추적 레이다 정보를 기반으로 하여 끊임없이 목표타겟의 위치를 재조정하는 “열추적 미사일”과 유사하다. 일반적으로 대기업은 이렇게 할 수 없지만 스타트업기업은 대기업과 상대하기 위해서는 자신의 최고의 장점을 극대화시킬 수 있는 극점의 방법을 반드시 선택해야만 한다.

1. 합리적이지만 굉장히 도전적인 목표를 정하고, 이를 달성하기 위한 도전적인 타임스케줄을 정하고, 이를 달성하기 위해서 최고의 노력을 다하라. 이러한 도전이 불가능하다고 의심하는 구성원은 탈락시켜라. 대부분의 프로젝트는 팀이 셋업되고 나서부터 6개월이내에는 완수되어야 한다. 타임스케줄은 당신회사의 생명줄이다.

2. 매일, 일주일, 한달 계속 조그만 변화를 예측하고, 실제로 변화를 실행하라. 최고의 작품이 나오기까지 고객중심의 최고의 솔루션 개발에 집중, 집중, 또 집중하라. (이는 당신이 개발한 것을 잠재적인 고객들에게 계속 보여주고 체크를 하란 의미이다. 보안이 걱정된다면, 보안서약서를 쓰더라도 고객들로부터 계속 계속 체크하라. 스타트업 기업은 ‘열추적 미사일’과 같아야 함을 한시도 잊어선 안된다)

3. 고도의 계산된 위험들을 기꺼이 안을 준비가 되어 있어야 하며, 동시에 그 위험들을 관리할 수 있는 방법을 적극적으로 모색하라. 주요 위험요소들은 모두 Listup한 후, 각각의 위험요소들을 항상 관리하고 생각하고 책임질 수 있는 위험 List별 경영진을 배정하라.

4. 스타트업기업은 장기적으로 가치를 지니고 있는 펀드멘탈적 핵심역량 요소에 모든 기업자원 (시간, 돈)을 쏟아부어야 한다. 소수 고객의 요구에 의해 절대로 이 원칙을 무너 뜨려서는 안된다.

5. 당신이 과거에 했던 모든 경험과 자산들을 이번 사업에 적극 활용하라. 과거에 실패했다고 모든 것을 새롭게 개발할 필요가 없다. 주위에 비슷한 사업에서 실패한 사업가들의 경험과 지식, 노하우를 적극 수용하라. 나에게 적합한 한 사람과의 단 한번의 식사가 당신회사의 10억원 가까이의 실수를 방지해줄 수 있으며, 훌륭한 대부분의 경영자는 그러한 자신의 경험들을 기꺼이 나누고자 할 것이다.

6. 모든 직원들은 매일 실제적인 사업결과물을 만드는데 직접적으로 연관된 일을 해야만 한다. 스타트업 기업에선 오직 CEO 혼자만이 관리자 역할을 해야만 한다. 그리고 CEO는 동시에 직원처럼 3~5가지 사업결과물을 만드는데 직접적으로 연관된 일을 해야만 한다. 그리고 임직원 모두가 자유롭게 얘기할 수 있는 “장벽없는 조직”을 반드시 만들어라. 왜냐면 모든 부서의 일들은 서로 깊이 연결되어 있기 때문이다.

7. 가능한 빨리 경영진부터 직원에 이르기까지 최고의 사람들을 고용하는데 집중하라. 절대로 평균적 사람을 뽑아선 안된다. 그들은 스타트업 기업을 죽이는데 일등공신이 될 것이다.

8. 홀로서기는 당신이 아무리 많은 돈을 갖고 있어도 반드시 거쳐야할 필수과정이다. 이 과정은 현금을 보존시켜줄 뿐만 아니라 “최소투입 – 최대결과란 진정한 비즈니스 수익모델”을 최적화시켜줄 수 있기 때문이다. 당신이 훌륭하게 사업을 하고 있다는 유일한 증거는 ‘수입 – 지출 > 0’이 되게 만드는 것이다. 벤처투자가들이 말한 “Show me the money”는 매우 중요한 말이다.

9. 비즈니스 플랜과 비전을 개발하라. 이는 당신의 시간과 비용을 절감시켜 줄 것이다. (비록 쓰고 난 후 버려진다 해도) 좋은 비즈니스 플랜은 살아있는 문서여서 매일 업데이트되어야 한다. 또한 비즈니스 플랜은 아래에 열거한 리스트들을 반드시 행하는 것을 강요하고 점검할 수 있도록 작성되어야만 한다.

9-1. 당신의 타겟시장을 세분화시켜 고객을 명확하게 정의하라. 즉 이는 실질적인 고객 명단을 갖고 있거나, 매우 세부적인 기준에 의해 고객이 정의되어야 함을 의미한다. 그리고 이들 타겟고객들을 대상으로 경쟁사가 줄 수 없는 “명확한 경쟁적 요소” 또한 명시되어야 한다. 당신이 그들에게 “어떻게 판매”할지를 명확하게문서로 규정하라.

9-2. 당신 회사의 상품/서비스는 가능한 한 좀 더 많은 방법으로 대기업과 압도 적으로 차별화될 수 있도록 포지셔닝해야만 한다. (Unique Selling Point /Position을 명확히 하라) 즉 이는 타겟고객들이 판매자를 변경하거나, 새로운 판매자를 선택하는 모험을 감수할 만큼 더 나은, 더 빠른, 더 저렴한 무언가가 제공되어야 함을 의미한다. 벤처캐피탈은 기존 경쟁사들에 비해 “1/2 가격”에 “2배이상의 혜택”이 고객에게 주어져야 한다고 강조한다. 이는 경쟁사들과 비교하여 최소한 4배 이상의 혜택을 고객에게 줄 수 있어야 함을 의미한다. 만약 이것이 이루어진다면 어떤 경쟁사도 그 시장에서만큼은 당신을 이길수가 없을 것이다. 왜냐하면 고객이 진정으로 원하는 것을 갖고 있기 때문이다.

9-3. 당신의 시장과 경쟁사들을 정확하게 이해하라. 그들 경쟁사들에 대한 정보를 매일 업데이트할 수 있는 시스템과 환경을 갖추어라. 반드시 누군가 한 사람은 그러한 일을 책임지고 있어야 하며, 책임소재가 명확해야 한다.

9-4. 당신 비즈니스의 재무적 민감도를 이해해야만 한다. 성공을 위해서는 어떤 부서, 어떤 영역에 얼마를 투자해야만 하는지를 명확히 알고있어야 한다.

9-5. 당신사업의 적절한 수익성을 위해 프리미엄 가격을 붙일 수 있도록 지속 적인 경쟁우위를 어떻게 유지할 수 있는지를 정의하라. 이는 상품(라인)의 진화가 가능한 세분화된 타겟시장에 진입해야 함을 의미한다. 일단 당신 회사가 초기시장 진입에 성공하고 수익이 발생하기 시작하면 더 큰 시장으로 확대할 수 있어야 한다. 시장 및 기술 선도기업들의 경우, 시장 우위 유지기간이 길지않은 경우가 많으므로, 당신 고객을 유지시키기 위해서는 몇 년뒤에는 새로운 USP가 반드시 필요하다.

9-6. 당신회사의 경영팀은 자원배분, 부서간 상호연결성, 재무적 제약요소와 같은 모든 중요한 문제에 있어서 반드시 동일한 자료와 정보를 갖고 판단할 수 있게 만들어야 한다.

10. 절대로 절대로 포기하지 말라! 향후 닥칠지도 모르는 여러가지 위험요소들을 충분히 멀리(스타트업단계에선 3~6개월 앞) 바라보면서 철저하게 준비하고 대비하면서 사업을 이끈다면 어떤 문제든 반드시 해결할 수 있는 대안이 존재하기 때문이다.

만약 당신이 이러한 조건들을 충족시키지 못한다면, 당신회사의 성공가능성은 급격히 줄어 들 것이다. 따라서 당신회사를 스타트업기업 모드에 적합한 경영으로 전환시킬 수 있도록 외부 경영자로부터 조언을 얻어라. CEO중 50%이상이 스타트업 경험을 가지고 있으며, 실제적으로는 그러한 경험을 가지지 않은 CEO는 한 사람도 없다.

[GIS] 자바 API를 이용한 ArcSDE 9.2 연동

환경은 ArcSDE 9.2이고..  ArcSDE 서비스 팩은 설치하지 않았으며 오라클은 10g 버전입니다. 그리고 ArcSDE에 대한 자바 API는 ArcSDE 9.2 서비스팩6에 해당합니다. 참고로 자바 API를 구성하는 jar 파일은 다음과 같으며 모두 반드시.. 필요합니다.

  • jsde92_sdk.jar
  • jpe92_sdk.jar
  • icu4j_3_2.jar

네.. 이제 ArcSDE와 연동하기 위한 자바 API에 대해 살펴보겠습니다.. 먼저 연결에 대한 코드입니다..

import java.util.*;
import com.esri.sde.sdk.client.*;

public class MainEntry {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        SeConnection conn = null;
        String server = "192.168.0.18";
        int service = 5151;
        String database = "";
        String user = "na_gis";
        String password = "na_gis";

        try {
            conn = new SeConnection(server, service, database, user, password);
            Vector layerList = conn.getLayers();
            System.out.println(layerList.size() + " layers existed... ");

            for(int i=0; i

위의 코드는 연결뿐만 아니라 연결된 ArcSDE 서버가 관리하고 있는 레이어 개수와 이름을 화면에 출력합니다.

다음은 레이어를 구성하는 필드 정보를 얻어 오는 코드입니다.

import java.util.*;
import com.esri.sde.sdk.client.*;

public class MainEntry {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        SeConnection conn = null;
        String server = "192.168.0.18";
        int service = 5151;
        String database = "";
        String user = "na_gis";
        String password = "na_gis";

        try {
            conn = new SeConnection(server, service, database, user, password);

            Vector tableList = conn.getTables(SeDefs.SE_SELECT_PRIVILEGE);
            System.out.println(tableList.size() + " table existed... ");
   
            for(int i=0; i

필드 정보는 레이어 개념이 아닌 테이블 개념으로 가져와야 합니다. 레이어는 테이블 + 도형 데이터 쯤으로.. 생각하면 됩니다.

다음은 테이블의 특정 필드(들)의 값을 얻어오는 코드입니다.

import java.util.*;
import com.esri.sde.sdk.client.*;

public class MainEntry {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        SeConnection conn = null;
        String server = "192.168.0.18";
        int service = 5151;
        String database = "";
        String user = "na_gis";
        String password = "na_gis";

        try {
            conn = new SeConnection(server, service, database, user, password);
            Vector tableList = conn.getTables(SeDefs.SE_SELECT_PRIVILEGE);

            SeTable tbl = (SeTable)tableList.get(89);

            SeSqlConstruct sqlConstruct = 
                new SeSqlConstruct(tbl.getQualifiedName());

            String[] cols = new String[1];
            cols[0] = "IST_YMD";

            SeQuery query = new SeQuery(conn, cols, sqlConstruct);
            query.prepareQuery();
            query.execute();

            SeRow row;
            while((row = query.fetch()) != null)
            {
                String value = row.getString(0);
                System.out.println(value);
            }
        } catch(SeException e) {
            e.printStackTrace();
        }
    }
}

얻어온 테이블 리스트(Vector tableList)에서 인덱스 번호 89에 해당하는 테이블의 IST_YMD 필드에 대한 값을 뽑아 내 화면에 표시합니다. 만약 SQL의 Where 구문을 지정하고자 한다면 SeSqlConstruct sqlConstruct 객체의 매서드 setWhere에 구문을 지정하면 됩니다. 예를 들면.. 만약 필드 ADM_NAM에 대해서 '목'으로 시작하는 조건의 경우는 다음과 같습니다.

    ....

    sqlConstruct.setWhere("ADM_NAM LIKE '목%'");

    ....

다음은 레이어에서 도형에 대한 좌표를 표시하는 코드입니다.

import java.util.*;
import com.esri.sde.sdk.client.*;

public class MainEntry {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        SeConnection conn = null;
        String server = "192.168.0.18";
        int service = 5151;
        String database = "";
        String user = "na_gis";
        String password = "na_gis";

        try {
            conn = new SeConnection(server, service, database, user, password);
            Vector layerList = conn.getLayers();

            SeLayer lyr = (SeLayer)layerList.get(4);
            SeSqlConstruct sqlConstruct =
                new SeSqlConstruct(lyr.getQualifiedName());

            String[] cols = new String[3];
            cols[0] = "BD_NM";
            cols[1] = "BD_MGT_SN";
            cols[2] = "SHAPE";

            SeQuery query = new SeQuery(conn, cols, sqlConstruct);
            query.prepareQuery();
            query.execute();

            SeRow row;
            while((row = query.fetch()) != null)
            {
                SeShape shp = row.getShape(2);

                double coordinates[][][] = shp.getAllCoords();
                System.out.println("coordinates.length = " + coordinates.length);
                System.out.println("coordinates[0].length = " + coordinates[0].length);
                System.out.println("coordinates[0][0].length = " + coordinates[0][0].length);

                double partCoords[] = coordinates[0][0];
                for(int i=0; i

얻어온 레이어 리스트(Vector layerList)에서 인덱스 4번에 해당하는 레이어에 대해서 필드 BD_NM, BD_MGT_SN 그리고 좌표에 대한 값이 담긴 SHPAE 필드를 지정해 쿼리를 실행합니다. 위의 코드는 지정된 레이어에 대한 모든 레코드를 읽어 오게 됩니다. 여기에 제한을 두어 지정된 MBR에 포함되거나 교차하는 레코드만을 얻어오는 코드는 다음과 같습니다.

import java.util.*;
import com.esri.sde.sdk.client.*; public class MainEntry {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        SeConnection conn = null;
        String server = "192.168.0.18";
        int service = 5151;
        String database = "";
        String user = "na_gis";
        String password = "na_gis";

        try {
            conn = new SeConnection(server, service, database, user, password);
            Vector layerList = conn.getLayers();

            SeLayer lyr = (SeLayer)layerList.get(4);
            SeSqlConstruct sqlConstruct = 
                new SeSqlConstruct(lyr.getQualifiedName());

            String[] cols = new String[3];
            cols[0] = "BD_NM";
            cols[1] = "BD_MGT_SN";
            cols[2] = "SHAPE";

            SeQuery query = new SeQuery(conn, cols, sqlConstruct);
            query.prepareQuery();

            // Add New Codes
            SeShape filterShape = new SeShape(lyr.getCoordRef());
            SeExtent ext = new SeExtent(148574, 146403, 148587, 146412);
            filterShape.generateRectangle(ext); 

            SeShapeFilter filter = new SeShapeFilter(lyr.getQualifiedName(), 
                lyr.getSpatialColumn(), filterShape, SeShapeFilter.METHOD_AI);

            SeShapeFilter[] filters = new SeShapeFilter[1];
            filters[0] = filter;

            query.setSpatialConstraints(SeQuery.SE_SPATIAL_FIRST, 
                false, filters);
            // At Here!

            query.execute();
   
            SeRow row;
            while((row = query.fetch()) != null)
            {
                SeShape shp = row.getShape(2);

                double coordinates[][][] = shp.getAllCoords();
                System.out.println(
                    "coordinates.length = " + coordinates.length);
                System.out.println(
                    "coordinates[0].length = " + coordinates[0].length);
                System.out.println(
                    "coordinates[0][0].length = " + coordinates[0][0].length);

                double partCoords[] = coordinates[0][0];
                for(int i=0; i

코드 번호 29~42에 해당하는 새로운 코드가 추가되었습니다.

완전하 SELECT 구문에 대한 SQL 문으로 Row을 읽어 오는 코드는 다음과 같습니다.

import java.util.*;   
import com.esri.sde.sdk.client.*; 

public class TestArcSDEQuery {
    public static void main(String[] args) {
        SeConnection conn = null;   
        String server = "222.237.78.208";   
        int service = 5151;   
        String database = "";   
        String user = "na_gis";   
        String password = "na_gis";   

        try {
            conn = new SeConnection(server, service, database, user, password); 
         
            SeQuery query = new SeQuery(conn);   
            query.prepareSql("SELECT * FROM CC_META");
            query.execute();   
  
            SeRow row;
            while((row = query.fetch()) != null)   
            {
                int cntFields = query.getNumColumns();
                SeColumnDefinition[] tableDef = row.getColumns();
             
                for(int iField=0; iField
	

[GIS] DuraMap-Xr, 특정 레이어를 최상단으로 이동시키기

특정 레이어의 이름을 gl이라고 할때.. 이 gl이라는 이름의 레이어를 최상단에 위치시키는 코드입니다.

String lastLayerName = XrMain.Layers.GetLayerName(XrMain.Layers.Count - 1);
if(lastLayerName.CompareTo("gl") != 0)
{
    XrMain.Layers.MoveLayer("gl", lastLayerName, false);
    XrMain.Update();
}

가장 먼저 최상단에 위치하는 레이어를 구하고.. 최상단의 레이어가 gl이 아닐 경우에 4번 코드의 MoveLayer 매서드를 통해 최상단으로 이동시켜 주면 됩니다. MoveLayer의 세번째 인자값을 false로 주었는데.. 이동시킬 위치를 기준으로 앞으로 이동시킬 것인지.. 뒤로 이동시킬 것인지에 대한 값입니다. 여기서는 false로 주었으므로 뒤쪽으로 이동시킨다는 의미입니다.

잠시 듀라맵을 이용하여 작업하던차에… 정리해 봅니다..