반응형

 

미래의 나에게 작성했던것 같은 글이 보여서 정리해서 올려봅니다.

지금 나의 상황이 그때와는 달라서 그런지, 지금의 제 생각과 다른 점들도 보이네요. ^^ 

기록이란 이런점이 재미있는것 같습니다.

 

 

아래 내용은 2000년부터 2012년 즈음까지 Windows 기반의 개발환경에서 개발하던 시절의 이야기입니다.

당시 저는 스마트폰이 아닌 Feature Phone 에서 RTOS를 base로 Middleware 에 해당하는 UI Framework 과 Application Framework을 개발했었습니다.

우리 팀은 새로운 피쳐를 개발하고 상품화하고, 어플리케이션 개발팀을 지원하고,  다시 신규 기능을 추가하고, 상품화하고 개선하고를 반복했었습니다.

그러다 Smart Phone 개발로 넘어가서 자체 OS 기반으로 UI Framework을 개발을 하던 시점입니다.

이 글을 써놓은 시점정확히 언제인지는 기억나지 않네요 ^^; 다만 마지막 수정 시점이 2012년 이었습니다.

당시 팀의 구성은 OS 개발팀과 Application 개발팀이 회사 내에 존재하며 모든 S/W를 팀내에서 소화해 내던 시절이었습니다.

스마트폰 개발로 넘어가면서 부터는 외부 개발자들도 늘어나긴 했지만, 소수일 뿐이고 모든 소프트웨어 개발은 내부에서 이뤄진다 보면 되는 상황이었죠.

 

 

2012년 어느날.

프로젝트의 성격과 팀의 규모에 따른 개발 전략...

 

Visual Studio .Net, Boland Java, JDK , National Rose , OOP , Design patten,

Direct X ,OpenGL? ,Oracle , My SQL, Clear case ...

위의 단어들은 프로그래머라면 상당히 많이 자주 들어본 단어일것이다. 

현재 수많은 개발자들을 위해 많은 통합환경과 개발 툴들이 나와있다.

고민해봐야 할것은 "이것들이 모두 정말 프로그래머를 위한 개발툴일까?" 하는 것이다.

만약에 프로그래머들을 상대로 돈벌이를 하는 회사들이 프로그래머의 주머니를 털려고 만들어 놓은 소프트웨어일수도 있지않을까????. 

본질은 프로그래머를 위한게 아니라 소프트웨어를 개발하는 팀에게 추진하는 프로젝트 완료를 빠르게 할수 있도록 도와주는 상품들 이라는 것이다. 프로그래머를 대상으로 하는 프로그램이라기 보다는 프로젝트를 상대로 하는 프로그램인것이다. 

소프트웨어를 개발하는데 있어서 좋은 툴을 이용해 빨리 개발을 완료 하는것이 가장 좋은 방법일 것이다.

그렇다면 저기 위에서 나열된 툴들 중(더많은 툴들이 있을테니 그 툴들을 포함해서) 어떤것이 가장 좋은 툴일까? 

 

자,, 지금부터 제가 예기하고자 하는것은 툴을 예기하자는 것이 아닙니다.

프로젝트의 본질에 대해서 좀더 고찰이 필요하다는 것을 예기하고 싶은 것입니다. 

예를 들면 , 단일 2~3사람의 프로그래머가 Scheduler를 제작하는 것이라고 하면 익숙한 툴 좋은 툴을 선택해서 별 고민 없이 진행해 나가면 됩니다. 

10~20명 정도의 개발자가 Web 기반에서 Com을 이용한 File sharing & Digital contents를 판매하기 위한 Client Server 소프트웨어를 제작한 구성한다고 하면

National Rose , Visual Studio , My SQL, Visual Interdev, 등 여러 툴들이 필요할것이다. 

그렇다면,

20명정도 되는 개발자들이 OS와 같은 플랫폼을 만들고 그 위에 올릴 여러개의 Application을 제작 하는 70명정도의 프로그래머가 있는 프로젝트가 있다고 하면, 어떤 툴을 사용해야 할까? 

 

이경우는 좀 특별한 경우가 될 것이다.

왜냐 하면 첫번째와 두번째는 특정 시스템 위에서 동작하는 어플리케이션 개발에 관한 이야기 이기 때문에 어플리케이션은 용도나 목적에 따라 툴을 선택할 수 있고,?어플리케이션의 설계를 변경, 유지보수 기능 및 성능 개선등 많은 부분에서 툴의 도움을 받을 수 있다. 

 

하지만 세번째의 경우는 툴을 논하는 것 보다는 전체 시스템의 설계에 모든 중심을 둬야 한다. 이 시스템이 적용될 Base Chip set과 Compiler ,Device의 목적과 목적에 따른 플랫폼 서비스의 종류와 확장형식, 어플리케이션구동형식(Task나 Thread 또는 단일 Task UI), Device Layer, 그리고 Application Service layer등 시스템 전반에 걸친 설계가 필요한 것이다. 

즉,20명의 플렛폼 개발자가 취해야할 사고의 영역이 바로 System 전반의 설계와 구현에 촛점을 맞춰져야 한다.

이를 바탕으로 디자인이 끝나는 시점에서 플렛폼 개발자들은 좀더 사고 영역을 넓힐 필요가 있다. 바로 70명의 Application 개발자들을 위해서이다. 

20명의 개발자들중 Application 구동형식과 API부분을 맡은 프로그래머라면 적어도 이런 고민은 해봐야 한다 . " 만약 어플리케이션 개발자가 개발경험이 거의 없는 프로그래머 초년생이라면?" 이라는 고민은 해봐야 한다. 또, "어떻게 하면 개발 기간을 단축시킬수 있을까?" 라는 것도 역시 함께 고민해야 한다. 

Microsoft도 이런 고민을 많이 하고 있기 때문에 선택권을 줬다.

Visual C++ 을 쓸것인지Visual Basic을 쓸것인지, Win32 API를 쓸것인지, MFC를 쓸것인지, Com을 쓸것인지 Socket을 쓸것인지... 등등의 선택권이 주어지도록 했다. 

그렇다고 70명의 앱 개발자 위해 통합 IDE(Visual C++, Visual Basic)를 새로 개발하여 제공한다는 것은 배보다 배꼽이 더 큰 경우일 것이다. 

현재 취할 수 있는 최선은 대응책은 어플리케이션개발에 너무 세세한 것까지 신경쓰지 않도록 개발 architecture및 flow , library등을 제공 하는 것이다.

커스텀 가능한 통합 IDE에 우리 어플리케이션을 개발할 수 있는 환경을 추가하는 것이다.

UI Layout까지도 제공을 하게 되면 Application 개발자들은 적어도 System 전반에 적용되는 common U 부분에 대해서 고민이 덜어 질 것이다. 

또 Flow manager 등의 모듈을 제공한다면?Workflow상 UI전환을 어떻게 해야 할 것 인지에 대해 정해진 룰을 따르면 될것이다.

따라서 화면 구성이나 플로우 전환을 위해 어떻게 할 것인지등에 대한 것 보다는 기능상 구현을 우선시 할 수 있게 된다.. Win32든 MFC든 UI를 위한 부분이 너무 많이 Application에 영향을 주어 Architecture가 복잡해지는데, 위 처럼 UI에 대한 작업이 줄어들면 줄어든 만큼 어플리케이션 구동에 대한 Architecture는 간단해진다.

 

 

뛰어난 어플리케이션 개발자에게 어떤 선택을 주어야 할까?

[Programming의 자유도를 높이는것.. 관연 약인가 독인가?]        

서론치고는 너무 길어졌는데요.

제가 주장하고자 하는 바는 system을 개발하면서 application영역을 모두 application 개발자에게 떠넘겨서는 안된다는 것입니다.

무슨 말이냐 하면 application 개발자의 역량에 의해 application의 질이 좌우되도록 모든것을 떠 넘겨 놓게 되면 프로젝트 전반에 걸쳐 많은 문제를 야기하게 될것 입니다.

각 application간의 밸런스도 문제가 되고 ,소프트웨어의 질과 유지보수 관계에도 많은 문제가 발생하게 됩니다.

위에서도 잠깐 언급했지만 우리는 현실적으로 항상 경험이 많고 우수한 어플리케이션 개발자와 일하지는 않는다는 것입니다.

경험이 적은 소프트웨어 개발자와 일 하게 된다는 것을 염두해 두고 Application개발자에게 제공되어야 하는 서비스가 뭔지를 결정해야 합니다.

혹, 어떤분들은 "만약 어플리케이션 개발자가 아주 유능하고 천제적이며 경험있는 사람이라면 어떻게 하시겠습니까?" 라고 질문 할수도 있습니다.

어떻게 해야 할까요? 이사람에게는 "당신은 유능하니 마음대로 하십시오" 라고 해야 할까요?.

제 경험상 유능한 사람일수록 자기가 가지고 있는 노하우나 기존의 프로그래밍 습관을 유지하려고 합니다. 어떻게 보면 현재 구성하려는 시스템을 흐트러 트릴 가능성이 많다는 것이죠.

물론 모든 유능한 개발자가 그렇다는 것은 아닙니다. 하지만 우리는 혼자서 소프트웨어를 개발할 수 있는 시대에 있지 않습니다.

우리가 시스템을 설계하고 개발한 후 다른 협력업체에 인터페이스를 오픈하고 우리의 시스템 위에서 어플리케이션을 개발하도록 할때가 많습니다.

유능하든 그렇지 않든 시스템을 전반적으로 이해하지 못한 상태에서 개발에 들어가야 하는 것이 어찌보면 현실 일 것입니다.

즉,어플리케이션 개발자가 매우 유능하다면 스스로 어플리케이션의 문제점이나 System의 핸디켑을  해결하기 위해서 다양한 방법을 시도 할 것입니다. 이부분이 때로는 유지보수에 어려움을 만드는 계기가 되기도 한다는 것이죠.

유능한 개발자들에게는 그들만의 영역을 따로 주는 것이 좋습니다. 그들이 가지고 있는 노하우가 System의 일부로 스며들수 있도록 System Layer의 작업환경을 주는것이죠.

또, Application의 core 영역에서 개발하도록 하는 것도 하나의 방법입니다.

"System을 개발하면서 application영역을 모두 application 개발자에게 떠넘겨서는 안된다는 것입니다."

이말은 System이 Application에게 System에 영향을 주지 않는 범위의 틀을 제공해야 한다는 것입니다. 그리하여 유능한 개발자든 아닌든 그 틀 안에서 자신의 역량을 펼치도록 만들고 , 제한하는 것입니다.

프로그래밍의 자유도는 틀 안에서만 허용이 되어야 한다고 생각됩니다.



회고

그 시절에는 개발자의 역량이 시스템에 꽤 많은 영향을 미쳤던것 같습니다. 그사람이 없으면 할수 없었던 일도 있었으니까요.

하지만 반면에 어플리케이션 개발은 가능하겠지만 혼자서 시스템을 만들수도 없었죠.

 

지금(2025년)에 와서 생각해본다면, 상황이 많이 바뀌었죠.

 

어플리케이션 중심 => 서비스 중심

OS위 에서 독립적(Stand alone)으로 동작 => 온라인 서비스를 기반으로 데이터를 쌓고 정보를 가공 제공하는 형태 (MSA, cloud, iot..)

하나의 언어로 개발 => 서비스기반의 다양한 언어와 다양한 플랫폼으로 구성 (html/css, python, nodejs, react, nextjs ....)

단일 플랫폼에서 동작 => 서비스가 기본적으로 다양한 플랫폼을 지원 (android, iOS, web)

통합 IDE의 부재 => 다양한 개발환경 (android studio, visual studio code, electron ....)

AI 의 발달..

 

이제는 개발자의 역량과 실력에 따라 더 좋은 대우와 어려운 미션이 부여되는 것은 맞겠지만, 그것이 플랫폼 영역을 의미하는 것은 아니게 되었네요.

하지만 한가지 공통된 것은 그 개발자의 위치는 시스템(서비스)내에서 영향력이 큰 곳으로 배치되기는 해야 겠죠. 그리고 본인이 원하는 일이여야 할것이고요.

 

시대가 바뀌어서 본인의 역량 뿐만 아니라 의지에 따라서 결과물이 크게 달라지는 시대입니다.

 

 

[참고]

바다 OS

 

타이젠

 

갤럭시 홈 미니 

 

 

반응형

 

소프트웨어 설계를 하다보면 디자인툴이 필요할때가 있습니다.

저도 설계를 진행하거나 아이디어 도출 단계, 그리고 시나리오 분석할때 UML을 자주 사용하는 편인데요.

UML 툴중에 GUI를 이용한 툴을 많이들 사용할겁니다.

 

저는 Plant UML을 자주 사용하는 편입니다.

 

텍스트로 입력해서 UML을 그려주니까 uml 을 그릴떄 선이나 위치 모양 등에 대해서 좀 신경을 안쓰고 타이핑(텍스트) 되어있는 이름과 플로우를 보면서 코딩되면 어떤 모양일지 생각해보게 되어서 좋은것 같습니다.

 

물론 단점도 있죠.. 텍스트로 입력하다보니 PlantUML 문법을 좀 알아야 하고, 마음에 드는 모양을 만들기가 좀 힘들긴 합니다.

그래서 보고용으로는 좀 별로인듯 한데,  근데 또 이것이 보고용 자료 만들때도 마음은 편해요.

Plant UML로 작성하겠다고 하고 진행하면, 나중에 아웃풋(결과물)에 대해서 "왜 이거 이렇게 그렸어? 모양이 맘에 안드네" 이런 말을 않고 넘어가게 되는 것 같아요... Plant UML은 원래 안되... 지가(프로그램이) 알아서 해줘.. 라는 인식? 때문에 그런듯 합니다.

 

 

아무튼 제가 자주 사용하고 있던 opensource로 운영되는Plant UML 에디터 사이트를 알려드겠습니다.

그리고 간단히 서버를 로컬에서 실행하는 것도 적어보겠습니다.

 

이 사이트가 열악한것인지 네트워크 연결이 안좋은것인지는 모르겠으나 uml을 작성하다 보면 종종 랙이 걸리거나 반응이 느릴때가 있어서 불편해서 로컬에서 사용하기 시작했습니다.

 

PlantUML 

PlantUML 에 대한 문법과 사용 가이드가 있는 사이트 입니다.

https://plantuml.com/ko/

 

간단한 텍스트를 이용하여 멋진 UML 다이어그램을 만들 수 있는 오픈소스 도구입니다.

간단한 텍스트를 이용하여 쉽게 멋진 UML 다이어그램을 만들 수 있으며, 다양한 종류의 다이어그램을 제공하고 있습니다. 또한, 생성된 다이어그램을 PNG, LaTeX, EPS, SVG 와 같은 이미지로 변환할 수

plantuml.com

 

Plant UML 에디터

제가 자주 사용하는 Plant UML 에디터는 여기에 있습니다.

history도 저장이 되어서 간단한 UML을 작성할때 사용합니다.

https://plantuml-editor.kkeisuke.dev/

 

PlantUML Editor

 

plantuml-editor.kkeisuke.dev

 

 

github

https://github.com/kkeisuke/plantuml-editor2

 

GitHub - kkeisuke/plantuml-editor2: PlantUML online demo client / Vue3 in Vite

PlantUML online demo client / Vue3 in Vite. Contribute to kkeisuke/plantuml-editor2 development by creating an account on GitHub.

github.com

github에도 소스코드 받아서 실행하는 법과 docker 이용하는 법이 잘 적혀있습니다.

저는 소스를 받아서 실행해 보려고 했는데 실패 했습니다. 그리고 docker를 이용해서 성공 했고요.

그래서 plantuml editor를 사용하는 것이 목적이라면 docker를 이용하는 방법을 추천 드립니다.

 

 

로컬에서 실행하는 방법 *** 핵심 ***

 

제가 테스트한 환경과 절차를 정리하면 다음과 같습니다.

 

PC: Macbook Air M1 

OS: MacOS

절차 : Docker 설치 -> colima 설치 -> colima 실행 -> docker image download -> docker image 실행

~/github $ brew install docker
~/github $ brew install colima


$colima start 

~/github $ colima start
INFO[0001] starting colima                              
INFO[0001] runtime: docker                              
INFO[0002] creating and starting ...                     context=vm
> Terminal is not available, proceeding without opening an editor
> Starting the instance "colima" with VM driver "qemu"
> QEMU binary "/opt/homebrew/bin/qemu-system-aarch64" seems properly signed with the "com.apple.security.hypervisor" entitlement
INFO[0097] provisioning ...                              context=docker
INFO[0097] starting ...                                  context=docker
INFO[0099] done                  


~/github $ Docker ps -a

///// plant uml 서버 image download
~/github $ docker pull plantuml/plantuml-server:jetty

///// plant uml 서버 실행
~/github $ docker run -d -p 4000:8080 plantuml/plantuml-server:jetty

 

docker desktop 말고 colima로 docker 실행 환경을 만들었고 그리고 나서 plantuml 서버 이미지를 다운로드 하고 실행 했습니다.

 

 

PlantUML 실행 화면

 

 

다들 설계도 잘하는 개발자가 되어 봐요~~

 

## 해피 코딩

 

반응형

저는 dynamodb를 이용하여 간단한 시스템을 구축한 경험이 있었는데요.

DB 사용 비용이 상당히 비싼 것을 보고 좀 놀랐습니다.

 

제가 받은 청구내역은 아래 와 같이 약 5$정도 였는데요.

(실제 서비스 비용은 아니고 서비스전 개발중에 받은 청구서라 서비스시에 얼마가 나올지를 예상하기는 힘들었습니다.)

 

청구 내역 -

Amazon DynamoDB
 
USD 5.32
$0.00 per hour for 25 units of read capacity for a month (free tier)
18,600 ReadCapacityUnit-Hrs
USD 0.00
$0.00 per hour for 25 units of write capacity for a month (free tier)
18,600 WriteCapacityUnit-Hrs
USD 0.00
$0.00014098 per hour for units of read capacity beyond the free tier
6,282 ReadCapacityUnit-Hrs
USD 0.89
$0.0007049 per hour for units of write capacity beyond the free tier
6,282 WriteCapacityUnit-Hrs
USD 4.43

 

 

그런데, 아래 링크를 보면 제 경험에 비해 훨씬 저렴하게 비용이 산정되어있어서 놀랐는데요.

DB선정에 있어서 가격이 전부는 아니지만, 그래도 민감한 부분이기는 하기 때문에 DB를 어떻게 구성해서 사용해야 하는지는, 전문가(?) 면담이 필요한것 같습니다.

Pricing
A wide variety of payment methods exist,
with the smallest database starting
at an upfront $243, or $24.82 monthly for a year.
Dynamo DB's prices vary according to region,
the provided example utilizes the US East (N. Virginia) prices.

Free Tier

  • 25 GB of data storage
  • 2.5 million stream read requests from DynamoDB Streams
  • 1 GB of data transfer out, aggregated across AWS services  

Example Pricing

Applications with 10M reads ($2,5), 1M writes ($1,25),
1 GB ($0,25) and continuous backup ($0,20) $4,20 USD

 

 

링크: https://serverlesstalent.com/compare/amazon-aurora-serverless/dynamodb

 

serverless:talent | Hire to build Serverless-first applications

Hire specialist developers to build full-stack serverless applications | Reduce risks, time & cost to market

serverlesstalent.com

 

 

 

 

 

 

 

     
About Product
Amazon Aurora Serverless is an on-demand, auto-scaling configuration for Amazon Aurora. It automatically starts up, shuts down, and scales capacity up or down based on your application's needs. It enables you to run your database in the cloud without managing any database capacity.

With Aurora Serverless, you simply create a database endpoint, optionally specify the desired database capacity range, and connect your applications. You pay on a per-second basis for the database capacity you use when the database is active, and migrate between standard and serverless configurations with a few clicks in the Amazon RDS Management Console.


Amazon DynamoDB is a key-value and document database that delivers single-digit millisecond performance at any scale. It's a fully managed, multi-region, multi-active, durable database with built-in security, backup and restore, and in-memory caching for internet-scale applications.
DynamoDB differs from other Amazon services by allowing developers to purchase a service based on throughput, rather than storage. If Auto Scaling is enabled, then the database will scale automatically. Additionally, administrators can request throughput changes and DynamoDB will spread the data and traffic over a number of servers using solid-state drives, allowing predictable performance.

Pricing
A wide variety of payment methods exist, with the smallest database starting at an upfront $243, or $24.82 monthly for a year.
Dynamo DB's prices vary according to region, the provided example utilizes the US East (N. Virginia) prices.
Free Tier

  • 25 GB of data storage
  • 2.5 million stream read requests from DynamoDB Streams
  • 1 GB of data transfer out, aggregated across AWS services  

Example Pricing

Applications with 10M reads ($2,5), 1M writes ($1,25), 1 GB ($0,25) and continuous backup ($0,20) $4,20 USD
Performance
Onboarding
Good documentation that includes tutorials.

Scalability
On-demand auto scaling configuration, sharding.

Regions
US, Africa, Asia Pacific, China, South America, Middle East and Europe. The support varies across specific versions of each database engine, and across AWS Regions.

 
Backups 
Aurora backs up your cluster volume automatically and retains restore data for the length of the backup retention period. You can specify a backup retention period, from 1 to 35 days, when you create or modify a DB cluster.  Aurora backups are stored in Amazon S3.

Security
By default, Aurora Serverless v1 uses the Transport Layer Security/Secure Sockets Layer (TLS/SSL) protocol to encrypt communications between clients and your Aurora Serverless v1 DB cluster. It supports TLS/SSL versions 1.0, 1.1, and 1.2.


Onboarding
Rich in documentation, with a great tutorial to start things off.

Scalability
Has automatic scaling as an option.

Regions
United States, Africa, Asia Pacific, Europe, Middle East.

To connect programmatically to an AWS service, you use an endpoint. In addition to the standard AWS endpoints, some AWS services offer FIPS endpoints in selected Regions.

Backups 
Charged separatedly from the project. Has three different options: Continuous backups, on-demand, or restoring a table.

Security
AWS is responsible for protecting the infrastructure that runs AWS services in the AWS Cloud. Includes data protection, identity and access management, infrastructure security, and more.


Technical Details
  • Compatible with MySQL and PostgreSQL
  • High-performance storage subsystem
  • Automates and standardizes database clustering and replication
  • Supports the full breadth of Aurora features, including Global Database, Multi-AZ deployments, and read replicas.
  • Takes advantage of the familiar Amazon Relational Database Service (Amazon RDS) features for management and administration.
Amazon DynamoDB is a NoSQL database that supports key-value and document data models. Developers can use DynamoDB to build modern, serverless applications that can start small and scale globally to support petabytes of data and tens of millions of read and write requests per second.
  • Microsecond latency with DynamoDB Accelerator
  • Automated global replication with global tables
  • Read/write capacity modes
  • On-demand mode
  • ACID transactions
  • Encryption at rest
  • Point-in-time recovery
  • On-demand backup and restore

 

반응형

종종 window 11 이나 회사, 학교, 기관에서 사용하는 PC에 추가기능 관련된 기능이 숨겨져 있는 경우가 있습니다.

이때 추가 기능 설치를 해야 하는경우 난감한데요.

 

appwiz.cpl 을 이용하여 추가 기능을 설치 할 수 있습니다.

 

Cmd, Shell, 또는 명령창을 실행합니다.

Window Key + R 을 눌러서 cmd.exe 를 실행하면 됩니다.

(관리자 권한으로 실행해야 하는 경우도 있음)

> appwiz.cpl

 

이렇게 실행하면, 제어판\모든제어판 항목\프로그램 및 기능 이 실행 됩니다.

Windows 기능 켜기/끄기 항목을 선택

그리고 나서, 필요한 기능을 찾아서 설치 하면 됩니다.

 

 

반응형

1. MediaPipe

https://developers.google.com/mediapipe

 

MediaPipe  |  Google for Developers

An open source, cross-platform, customizable ML solution for live and streaming media.

developers.google.com

On Device AI 를 쉽게 구현하고 다양한 서비스를 만들수 있는 프래임워크입니다.

 

MediaPipe 솔루션은 애플리케이션에 인공 지능(AI) 및 기계 학습(ML) 기술을 신속하게 적용할 수 있는 라이브러리 및 도구 모음을 제공합니다. 이러한 솔루션을 애플리케이션에 즉시 연결하고 필요에 맞게 사용자 정의하며 여러 개발 플랫폼에서 사용할 수 있습니다. MediaPipe 솔루션은 MediaPipe 오픈 소스 프로젝트 의 일부 이므로 애플리케이션 요구 사항에 맞게 솔루션 코드를 추가로 사용자 정의할 수 있습니다. 

 

 

 

 

 

 

 

 

미디어파이프의 데모를 확인해볼 수 있는 좋은 예제가 될 것 같아 링크를 해놓습니다.

 

 

https://makernambo.com/155?category=774191 

반응형

DevOps 란 ?

인터넷 서비스는 서비스 개선을 빠르게 부담 없이 적용 하는것이 매우 중요합니다.

사실 이 부분은 인터넷 서비스 뿐만 아니라, 거의 모든 소프트웨어 분야에서 요구되는 사항이긴 하죠. 

빠르고 완벽하게 되면 뭐든 좋은거니까요. ^o^

 

서비스만 놓고 얘기해보자면, 아래와 같이 몇가지 단계로 구분 해볼 수 있을 것이에요.

기획 -> 개발 -> 테스트 -> 배포 -> 운영

 

DevOps 라는 개념은 이 과정을 단순화 하고 쉽게 할 수 있도록 하는 것인데요, 말 그대로 개발(Dev) 과 운영(Operation)즉,  개발된 S/W를 빠르게 배포하고 운영을 하는 것입니다.

 

DevOps라는 명칭이 사용하게 된 것도 이런 개념을 담은 솔루션들이 나왔기 때문이겠죠....

 

 

관련해서 읽어볼 꺼리들을 링크로 공유 합니다.

 

https://jjeongil.tistory.com/854

 

DevOps : 관련 도구 : 종류, 소개

위 그림은 DevOps 수명 주기 전반의 도구 사슬을 표현하였습니다. 도구 사슬의 의미는 각 영역이 별개가 아니라 도구 간 연계를 통해서 시너지를 이룬다는 측면을 강조한 것입니다. 각 영역별로

jjeongil.tistory.com

 

 

https://tech.ktcloud.com/19

 

협업 프로젝트 관리 1부 - 오픈소스 툴 소개

 개인 vs 팀의 프로젝트 관리 어느 날, 친구에게 교통사고를 당했다는 연락을 받은 나 (다급)괜찮아? 안다쳤어? vs (침착) 보험 들었어? 여러분은 어떻게 반응하시나요? 1000% J형이라 대학생 때부터

tech.ktcloud.com

 

반응형

SW를 개발하기 위해서는 가장 중요한것이 무엇인가??

 

사용자 인터페이스나 비지니스 로직을 다루는 부분이 아닌 핵심 알고리즘이나 프래임워크(Framework) 을 주로 다루는 개발자로서 평소에 사용자의 요구사항부터 사용자 시나리오에서의 Usecase 까지 고려해서 이와 같은 질문을 해볼 기회가 별로 없었습니다.

 

그리고 일반적으로 개발자들은 사용자의 요구사항이나 시나리오보다는 SW 의 구조, 기술적 난이도, coding 방식에 더 관심이 많고 S/W의 중요한 부분도 이 부분에 있다고 생각하죠.

 

"이번에 새로 알게된 기법인데... 적용해봐야지" "잘 구현하면 되지!" "성능을 어떻게 높일까?" "다른 기기에 포팅 해볼까?" 

이런것에 더 흥미를 느끼고 이를 손으로 구현 해 냈을 때 만족을 느낄 겁니다.

저도 개발자이다 보니 당연히 이런것에 더 흥미를 느끼고 재미를 느끼기 때문에 200% 공감하는 바이고요.

 

그렇지만, 프로젝트를 진행하면서 개발자들이 슬픈 상황이 맞이하게 되는 경우가 많은데요.

분명 좋은 아이디어를 찾아내고 구현해서 훌륭한 퍼포먼스를 내는 모듈을 개발했는데, 그리고 누가 봐도 멋지다라고 생각하는데, 기존 대비 훨씬 좋아진 성능에도 불구하고, 프로젝트의 비전이 점점 흐려지고, 성공에 대한 가능성이 낮아지면서, 경쟁 프로젝트들과의 격차가 발생하는 등 개발자가 스스로가 느끼기에도 뭔가 분위기가 안좋아 지는 것입니다.

그리고 나서는 프로젝트는 종료되거나, 성공적으로 런칭해도 시장에서 반응이 싸늘한 경우일 것입니다.

 

저도 여러번의 대형 프로젝트에 소속되어 개발자로 활동 했었고, 실제로 프로젝트는 성공 했었고 회사에서도 큰 수익이 발생했었습니다. 그러나 몇년 후 시스템은 시대에 맞지 않아서 프로젝트는 종료되었고, 신규 프로젝트가 실행되었고 새로운 모듈을 담당하게 되고 개발을 진행했었지만, 이 시스템도 시대의 요구에 부합되는 그런 프로젝트는 아니었는지 상품화 되지 못하고 종료되었습니다.

 

그러나 개발자 입장에서는 "내 모듈에는 크게 문제가 없고 열심히 하면 프로젝트에 이상이 없을것 같은데, 왜 그만 두려고 하지?" 라는 의문이 있었습니다.

 

도대체 뭐가 문제 였을까요? 프로젝트 기획이 좀 잘못되었어, 디자인이 별로야, 에니메이션 요소를 더 많이 사용했어야 하는데 UX가 첨에는 세련되 보이지만 오래 사용하다보면 질려, 성능이 너무 안나와, 안정성이 너무 떨어져서...

다양한 이유를 말할 수 있겠지요.

 

그런데 진짜 원인은 무엇이었다 라고 자신있게 말할 수 있는 사람이 있을까요? 

 

프로젝트의 성공을 바라는 관점에서 

 

개발을 오래 하다보면 나름의 인사이트가 생긴다. 프로젝트의 난이도라든가, 시대에 부합하는지, 기술적으로 경쟁력이 있는지 등등은 그냥 감으로 느껴집니다.

 

그리고 다른 팀의 팀원들과도 (한회사에서 오래 다니다 보면, 한팀에 있다가 쪼개지고, 다시 합쳐지고 해서 친한 사람이 많아진다.) 커피한잔 하면서 얘기하다보면, 어떻게 흘러가는지 감이 옵니다.

 

그러면서 드는 생각들이 "아.. 왜 이걸 이렇게 진행하지..?? 이게 경쟁력이 있다고 생각하나?" 라는 생각부터 해서 "나라면 이렇게 하겠다." 그리고 나서는 조금 깊게 생각하려고 하다가 머리속에서 분명 명확하다고 생각했던 해답이 없어지고, "아.. 그냥 시키는대로 개발 해야지.. 복잡해.." 라고 하는 개발자 전형의 루틴으로 하루를 보내고 퇴근하게 되죠.

 

한번 생각해보자.!! 프로젝트를 성공 시키기 위해서는 도대체 뭐가 필요한걸까?

시대를 앞서가는 비전? 사용자들이 감동할만한 UI? 빠른 성능? 대박을 터트릴 수 있는 수익 모델?

기술적 선도할 수 있는 AI 기술? 

 

프로젝트는 과연 어떻게 해야 성공할 수 있을까? 

그냥 복불복 인가?? 하늘에 맡기면 되는가?

 

자신이 진행하고 있는 프로젝트를 제외하고 "프로젝트" 라는 단어를 떠올리면, 대부분 이런 생각이 들곤한다.

"세상에 없던 어떤것? 갑자기 멋진 아이디어가 떠올라서 뭔가 열씸히 코딩해서 짠.. 하고 나타나는것..."

회사에서 스트레스 받아가면서 프로젝트를 진행하면서도 이런 생각이 떠오른다는게 신기하죠.

 

프로젝트는 어떻게 시작 될까?

갑자기 개발자가 멋진 아이디어를 짠 하고 생각했다고 해서 프로젝트가 진행될 수 있을까요?

 

우리 모습을 살펴보면 아마 이런 모습일겁니다.

어느날 팀장이 개발 회의 시간에 "QR code를 인식하는 기능이 필요한데, 얼마나 걸릴까요?" 라고 물어볼겁니다.

흠...  과연 누가 기능이 필요하다고 했을까요?

 

아마 프로젝트를 기획 하는사람이 팀장이랑 얘기하다가 필요한 기능이 나왔을 겁니다.

기획하는 사람이랑 무슨 얘기를 했길래 그런 기능이 나왔을까요? "제품에 대한 상세 정보나 가격 정보를 보여주고 싶은데 어떻게 하면 좋을지 아이디어가 있을까요?" 같은 질문이 회의상에서 나왔겠죠.

그러면 참여자들은 여러 아이디어를 얘기하다 NFC, QR code, Bar code, 카메라로 제품 인식을 자동으로 하는 기능 등 다양한 얘기가 나왔다가 결국 QR code 로 정해졌겠죠.

 

그러면 제품에 대한 상세 정보를 보여주고 싶다고 하는 요청은 어디서 나왔을까요? 

어디선가 나왔겠죠... 기획 하는 사람이 아이디어를 냈을 수도 있지만, 기획 하는 사람에게 뭔가를 요청한 누군가가 있겠죠?? 

 

중고차량 매매 회사 사장님이 요청 했습니다.

"우리 중고차 매매회사에서는 온라인 서비스를 하고 싶어요.

어떤 사람이 지나가는 차를 보고 누군가가 와... 저차 멋지네, 가격 얼마지?? 이런 생각을 했을때 핸드폰으로 가격이나 스팩 정보를 쉽게 찾아 볼수 있도록 했으면 좋겠네요." 

 

라고 얘기 했다고 하네요. (가상입니다.)

 

그럼 다시 돌아가서,

이 요구사항을 가지고 기획 하는 사람이 중고 차량 정보를 확인할수 있는 기술적인 방법이 있는지 개발 팀장과 얘기 했습니다.

개발 팀장은 아이디어중 구현이 용이한 방법(QR 코드)을 찾았고, 기획자와 논의 했습니다.

그리고 개발팀에서 해당 기능을 개발 진행하기로 한것입니다.

 

어떤 생각이 드시나요. 얼핏 들으면 말이 되는것 처럼 보이는데 구멍이 숭숭숭 뚫려있죠?

QR code는 어디에 붙어있어야 할까요? 과연 성공적인 온라인 서비스가 될 수 있을까요?

 

만약 이 요구사항을 듣고, 제대로 된 논의 과정을 거쳤다고 한다면 다음과 같이 논의 되지 않았을까요?

 

개발자: 처음에 들었을때는  QR코드로 특정 제품 정보를 보여주는거로 알았는데, 지금 요구사항을 들어보니까. 이건 QR코드로 할게 아닌데요?

기획자: 다른 기술적인 내용은 잘 몰라서 그러는데 어떤 방법이 더 있을 까요?

개발자: 일단 기술적인 난이도를 떠나서 얘기해보자면, 카메라로 바로 해당 차를 찍어서 link가 뜨게 만들어야 될것 같아요. 남에 차에 QR코드가 있을 리가 없잖아요.

기획자: 그게 가능하면 그렇게 하면 좋겠네요.

개발자: 근데 이거 영상인식인데.... 기능이 엄청 어려울것 같아요. 영상인식쪽 잘 아는 개발자가 더 필요할것 같아요.

 

그럼 영상인식으로 기능이 들어가면 될까요?

여기서도 더 고민 해봐야 할 부분들이 있습니다.

일반 사용자는 과연 이 어플리케이션을 기본 카메라로 사용할까요?

그리고 저 차 얼마지? 라고 생각하고 해당 어플리케이션을 실행하고 사진 찍고 하는 수고를 할까요?

글쎄요. 좋은 기능이긴 하지만, 제 생각에는 이 기능으로는 고객을 만족 시킬 수 없을 것 같네요. 여러분의 생각은 어떤가요?

이런 의견이 있을 수 있겠죠.

"그냥 카메라로 사진을 찍고, 해당 앱에서 갤러리의 사진을 읽어서 찾아주면 되지 않을까?" 이런 의견요.

 

그런데 좀 근본적인 고민을 해봅시다.

이 서비스의 핵심은 뭔가요?

중고차 사장님이 얘기한 내용의 핵심이 카메라로 지나가는 차를 검색하는 것이 아니라, 본인 화사가 가지고 있는 중고 차량의 가격, 사고 이력, 연식, 등등의 정보를 한눈에 살펴볼 수 있게 해주고 고객이 쉽게 선택할 수 있게 하는 부분입니다.

카메라를 활용하는 부분은 시스템(어플리케이션)의 일부 기능이죠.

 

만약 그렇다고 한다면, 

영상인식/이미지 인식(AI)에 구현할 수 있는AI 개발자 채용와 학습데이타 수집 비용, 개발시간등 많은 리소스를 보조적인 기능에 투자하는 것이 됩니다.

 

올바른 요구사항을 뽑기 위해서 프로젝트의 고객과 고객의 요구사항에 대해서 진지하게 논의 해보고 원하는 목표가 무엇인지를 그리고 우선순위가 무엇인지를  다시 고민했어야 할 것입니다.

 

고객님이 TV나 유투브 같은데서 카메라로 뭔가를 인식하고 하는것에 꽃혀서(좋은 말로 감명 받아서) 이 기능을 언급 했다고 하더라도, S/W를 개발하는 기획자, 개발자 입장에서는 요구사항에 대해서 진지하게 목적이 무엇인지 해당 기능으로 무엇을 하고 싶은지를 진지하게 고민하고 의견을 교환 했어야 한다고 생각되죠? 

 

"우리 중고차 매매회사에서는 온라인 서비스를 하고 싶어요.

어떤 사람이 지나가는 차를 보고 누군가가 와... 저차 멋지네, 가격 얼마지?? 이런 생각을 했을때 핸드폰으로 가격이나 스팩 정보를 쉽게 찾아 볼수 있도록 했으면 좋겠네요." 

=> 고객님의 중고매장에서 소유하고 있는 멋진차를 핸드폰에서 쉽게 가격과 스팩을 확인하여 구매할 수 있도록 하는 중고차 정보를 제공하는 어플리케이션을 먼저 개발 하는 것이 좋겠습니다.

그리고 카메라를 이용한 차량정보를 확인하는 기능은 사실 AI 분야이고 비용과 시간이 많이 발생하게 됩니다. 

이 부분은 어플리케이션 개발후 다시 논의 해보는 것이 어떨까요? 

 

 

프로젝트를 성공하기 위한 조건

프로젝트 성공이란 프로젝트의 진정한 목적을 찾고 그 목적을 제대로 수용하여 고객이 만족 할 수 있도록 하는것입니다. 단순하게 고객이 얘기한 내용을 그대로 반영한다고 해서 성공 하는 것이 아닙니다.

고객이 요구한데로 어플리케이션이 구현 되었다 하더라도, 고객은 분명 마음속으로

"어.. 카메라 부터 뜨네? 우리 회사 차량 정보는 어디서 봐?"

"음.. 이게 아니었는데.. 아.. 내가 생각했던거랑 달라"

라는 의문을 갖을 수 있습니다.

 

고객은 분명 기능을 통해서 서비스의 성공적인 모습을 머리속으로 그렸을 것입니다.

여기서 중요한 것은 "기능" 이 아니라 "서비스의 성공적인 모습", 요구공학에서 얘기하는 비지니스 골, 달성하고자 하는 목표 입니다.

 

달성하고자 하는 목표(비지니스 골) 이 중요한 것이지 기능은 고객이 제시한 기능이든 아니든 사실상 상관이 없습니다.

위 상황에 빗대어 얘기해보면, 모바일 어플리케이션에서 고객들이 쉽게 원하는 차를 고르고 구매할수 있도록 하는것이지, 카메라나 영상인식 이 중요한 것은 아니라는 의미입니다.

 

집중해야 할것을 찾는 것!

 

요즘처럼 어플리케이션들이 넘처나는 시대에 다른 어플리케이션과의 차이을 보여줄 수 있는 기능은 참 매력적입니다.

하지만 그게 다는 아니라는 것!!!

 

마무리

특정분야로 이야기를 좁히지 않고, 좀더 공감이 될 수 있을것 같아서 온라인 서비스를 예로 들어봤습니다.

(요즘은 Offline 시장을 Online으로 옮기는게 대새???  ^^)

트렌드에 뒤쳐지지 않기 위해서 온라인 서비스를 가지고 이야기를 해봤습니다.

 

!!해피코딩!!

반응형

진행하고 있던 프로젝트에서 지도 정보가 필요하여 찾아봤던 자료들 입니다.

 

무료로 좌표계를 받을수 있는 곳을 찾기가 힘들어 고생했던 기억이 있어서 그당시 찾아봤던 site들을 정리해봤습니다.

 

 

결국 위도 경도 정보를 data로 구해야 해서 저는 python panda로 data를 구했었습니다.

 

 

 

https://www.esrikr.com/arcgis-guide/arcgis-pro-master-2/

 

 

[ArcGIS Pro 완전 정복!] ②기본 | 한국에스리

☞ 2차원 맵과 3차원 씬 연결 [보기(View)] → [뷰 연결(Link Views)] → [중심 및 축척(Center and Scale)] 클릭 데이터 탭을 클릭하여 드래그 → 뷰에서 십자형 사각형 중 원하는 모양에 배치하면 2차원 맵과

www.esrikr.com

 

 

 

 

지도 정보 찾기

 

 

 

https://earthdata.nasa.gov/

 

Earthdata

The Earth Observing System Data and Information System is a key core capability in NASA’s Earth Science Data Systems Program. It provides end-to-end capabilities for managing NASA’s Earth science data from various sources—satellites, aircraft, field

earthdata.nasa.gov

 

Global Map data archives

 

https://globalmaps.github.io/

 

Global Map data archives

Use of geospatial information is crucial for solving various issues around the world including global environmental problems. In order to solve these diversified issues and to advance sustainable development, it is important to make fundamental geospatial

globalmaps.github.io

 

https://globalmaps.github.io/glcnmo.html#code

 

Land Cover (GLCNMO) - Global version - Global Map

The Global Land Cover by National Mapping Organizations (GLCNMO) is geospatial information in raster format which classifies the status of land cover of the whole globe into 20 categories. The classification is based on LCCS developed by FAO. Therefore, it

globalmaps.github.io

 

 

http://www.diva-gis.org/datadown

 

Spatial Data Download | DIVA-GIS

 

www.diva-gis.org

 

 

https://datascienceschool.net/view-notebook/ef921dc25e01437b9b5c532ba3b89b02/

 

Data Science School

Data Science School is an open space!

datascienceschool.net

pandas

 

 

import geopandas as gpd
import matplotlib.pyplot as plt
import matplotlib.path as mpath
import matplotlib.patches as mpatches

gpd.__version__


def get_pos(PosData) : 
    return PosData[0],PosData[1]


print(gpd.__version__)

countries = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
cities = gpd.read_file(gpd.datasets.get_path('naturalearth_cities'))

#countries.tail(3)

print(countries.name)


china = countries[countries.name == "China"].geometry



china.boundary.squeeze()

china.plot()


rect = china.total_bounds

fig = plt.figure()
ax =fig.add_axes(rect,)

fig.delaxes(ax)
fig.add_axes(ax)


# sub plot

# ax = plt.subplots()   

# pos = [[china.total_bounds[0],china.total_bounds[1]],
#         [china.total_bounds[2],china.total_bounds[1]],
#         [china.total_bounds[2],china.total_bounds[3]],
#         [china.total_bounds[0],china.total_bounds[3]]]
# Path = mpath.Path
# path_data = [
#     (Path.MOVETO, (pos[0])),
#     (Path.LINETO, (pos[1])),
#     (Path.LINETO, (pos[2])),
#     (Path.LINETO, (pos[3])),
#      (Path.CLOSEPOLY, (pos[0])),
#      ] 
# ax.plot(path_data)        
# #    
# codes, verts = zip(*path_data)
# path = mpath.Path(verts, codes)
# patch = mpatches.PathPatch(path, facecolor='r', alpha=0.5)

#  ax.add_patch(patch)

# x, y = zip(*path.vertices)
# line, = ax.plot(x, y, 'go-')
# ax.grid()
# ax.axis('equal')

plt.figimage(fig)
plt.show()


#china.

with open("china_map.txt", mode='wt') as f:
    f.write(china)

print(china)
#ax.set_title("세계 지도")
#ax.set_axis_off()


#print(countries)
i=0
while 1 :
    i+=i

 

 

결과 

더보기

result: 

"{\"type\": \"FeatureCollection\", \"features\": [{\"id\": \"139\", \"type\": \"Feature\", \"properties\": {}, \"geometry\": {\"type\": \"MultiPolygon\", \"coordinates\": [[[[109.47520958866365, 18.197700913968575], [108.65520796105616, 18.507681993071387], [108.62621748254044, 19.367887885001906], [109.11905561730804, 19.821038519769345], [110.21159874882281, 20.101253973872033], [110.78655073450221, 20.077534491450052], [111.01005130416458, 19.69592987719072], [110.57064660038677, 19.25587921800927], [110.33918786015147, 18.678395087147592], [109.47520958866365, 18.197700913968575]]], [[[80.2599902688853, 42.34999929459906], [80.1801501809943, 42.92006785742694], [80.86620649610126, 43.18036204688101], [79.96610639844141, 44.91751699480463], [81.9470707539181, 45.31702749285312], [82.45892581576906, 45.539649563166506], [83.18048383986047, 47.33003123635086], [85.16429039911324, 47.0009557155161], [85.72048383987067, 47.452969468773105], [85.7682328633083, 48.45575063739699], [86.59877648310336, 48.549181626980626], [87.35997033076265, 49.21498078062912], [87.75126427607671, 49.297197984405486], [88.01383222855173, 48.599462795600616], [88.85429772334676, 48.069081732772965], [90.28082563676392, 47.69354909930793], ...

'개발 Note > it 이야기' 카테고리의 다른 글

DevOps 선택하기...  (0) 2022.05.25
SW를 개발하기 위해서는 가장 중요한것이 무엇인가??  (0) 2021.08.20
AI assistant battle  (1) 2019.10.29
Synergy  (0) 2019.09.27
Galaxy Home - mini  (0) 2019.08.28

+ Recent posts