- @펌: https://brunch.co.kr/@qqplot/15

 

어떻게 뛰어난 개발자가 될 수 있는가?

 

1. 의식적인 연습을 한다.

단순히 반복하는 것이 아닌,

어려운 문제를 통해 스스로의 한계에 도전하며 시도하고

끝난 뒤에는 성과를 분석하고 실수를 고쳐나간다.

이를 반복하고 다시 반복한다.

 

** 주어진 영역에서 개인의 최고 수준의 성과는 오랜 경험만 넣으면 결과가 나오는 함수처럼 자동으로 얻어지지 않는다.

그 수준의 성과는 굉장히 숙련된 사람에 의해서도 의식적인 연습을 통해서만 나온다.

** 누구든 요리할 수는 있다. 하지만 겁없는 자만이 훌륭한 쉐프가 될 수 있다. 위인들은 기꺼이 삶의 많은 부분을 의식적인 연습에 헌신한다.

 

2. 지름길은 없다는 사실을 안다.

선천적으로 재능있는 사람도 최고 수준에 도달하기 위해서는 매주 10-20시간씩 여러 해가 걸린다는 사실을 안다.

 

 

'태도' 카테고리의 다른 글

[태도] Go to guy 가 되자.  (0) 2021.12.28
블로그 이미지

uchacha

개발자 일지

,

[Java] 연산자 우선순위

Java 2022. 12. 18. 17:23

- @참고: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=dnzh&logNo=100134269443

 

- 우선순위가 높은 순서부터 낮은 순서대로 

연산기호 결합방향 우선순위
 expr++, expr--    
++expr, --expr, 부호연산자, !, ~    
*, /, %    
+, -    
shift 연산자    
부등호, instanceof    
비교(==, !=)    
순서대로 우선순위 &, ^, |    
순서대로 우선순위 &&, ||    
삼항연산자    
대입(=, +=, -=, *=, /=, %=, &=, ^= , |=, <<=, >>=, >>>=)    

 

* 후위 증감 연산자 (expr++, expr--) 

';' 를 만나거나 같은 변수를 만날 경우 변경된 값이 저장된다.

 

'Java' 카테고리의 다른 글

[Java] Heap 모니터링 & Heap Dump 분석하기  (1) 2023.05.10
[Java] LocalDateTime, Timestamp 변환  (0) 2021.02.26
[Java] Set to List, List to Set  (0) 2021.02.25
[Java] Optional 사용법  (0) 2021.02.19
[Java] 파일 입출력  (0) 2021.01.27
블로그 이미지

uchacha

개발자 일지

,

- 펌(소프트웨어 개발 수명주기(SDLC)): https://www.servicenow.com/kr/products/devops/what-is-sdlc.html

 

SDLC의 이점

모든 사람이 동의하고 이해할 수 있는 중앙 집중식 사전 목표를 제공함으로써, 리소스 및 관련 비용을 비롯하여 명확한 개발 계획을 세우고, 계발을 올바르게 수행할 수 있도록 역할을 할당할 수 있음

 

소프트웨어 개발 수명주기(SDLC)

1. 현재 문제 식별

2. 계획 수립

who: 프로젝트 리더

what:

- 프로젝트에서 다룰 범위 명확하게 정의

-> 프로젝트가 범위를 넘어서 확장되거나 바뀌지 않도록 프로젝트의 경계를 설정

- 인건비, 재료비 계산

- 프로젝트 조건을 평가하여 목표가 설정된 일정표 구성

- 계획에 이해 관계자, 애플리케이션으로 혜택을 얻는 사람의 피드백 사안도 포함

3. 요구 사항 정의

- 요구사항을 정의 및 문서화 하고 이해 관계자에게 승인을 얻음

* 요구사항: 애플리케이션 목적, 포함할 기능, 해당 과정에서 나타날 수 있는 장애물을 규정

* 필요조건: 리소스를 식별하고 프로젝트에 구축

4. 디자인 및 프로토타이핑

- 애플리케이션이 작동하는 방식, 디자인 요소를 모델링하는 설계 단계

  - UI: 고객이 소프트웨어와 상호작용하는 방식과 소프트웨어가 특정 입력에 응답하는 방식

  - 프로그래밍

  - 보안: 애플리케이션의 보안을 보장하기 위해 실행할 특정 조치. SSL 암호화, 암호 보호 및 안전한 데이터 저장 등

  - 통신: 애플리케이션이 중앙 서버와 같은 다른 자산과 통신하는 방법

  - 아키텍처: 업계 관행, 모든 템플릿, 전체 디자인 및 특정 프로그래밍 언어

  - 플랫폼: 소프트웨어를 호스팅할 플랫폼

- 설계 후 애플리케이션의 인터페이스, 응답 방법, 실행 기능에 대한 기본 아이디어를 보여주기 위한 프로토타입 구축

-> 애플리케이션을 승인하기 위해 이해 관계자로부터 피드백을 받음

5. 소프트웨어 개발

- SDLC 단계

-> 테스트 결과를 기다리거나 코드를 컴파일하는 것과 같이 생산을 지연할 수 있는 소프트웨어 개발 프로세스 문제를 예측, 해결

6. 테스트

- 애플리케이션 부문마다 다른 부문과 문제없이 상호작용하면서 각 기능이 실행되는지 확인

-> 사용자가 애플리케이션을 사용할 때 발생할 수 있는 버그를 줄이고, 사용율을 높이고, 사용자 만족도를 개선

7. 배포

8. 운영 및 유지관리

- 테스트 중에 발생하지 않는 버그를 발견하고 해결

-> 자체 반복 프로세스로 시작할 수도 있음

 

SDLC 방법론

1. Waterfall

- 선형모델, 이전 단계가 완전히 끝날 때까지 다음 단계를 시작할 수 없음.

- 기업이 프로세스 각 단계에 대한 연속성과 실행 가능성을 분석하는데 도움이 되어 병목 현상이나 사일로(부서 이기주의)를 제거하는데 유용

2. Agile

- 사용자 입력과 경험을 핵심적으로 강조

- 피드백에 매우 민감하게 반응하며, 급변하는 시장에 적응하기 위해 더 빠른 주기로 소프트웨어가 출시되도록 운용

3. 반복

- 소프트웨어 초기 버전을 신속하게 구축 후 간단한 반복 과정을 거쳐 개선

- 애플리케이션을 시작하고 실행할 수 있는 대규모 애플리케이션에서 일반적으로 사용되는 접근 방식

-> 비즈니스 요구를 보다 빠르게 충족함

4. DevOps

- Agile과 유사함. 설계 및 구현 단계에서 소프트웨어 사용자로부터 피드백을 수집하여 개발된 애플리케이션의 사용성과 관련성을 개선

- 구성원 팀원 간의 적극적인 공동 작업 및 커뮤니케이션을 활용하여 제품에 관한 모든 측면을 다룸. 개발, 테스트, 보안, 정보 기술 운영 역할을 맡는 담당자가 참여.

5. Spiral

- Waterfall에서와 같이 순차 프로세스로 다른 모델의 반복 접근 방식을 사용

-> 개발 과정에서 프로세스의 각 단계를 반복적으로 거치면서 Spiral 단계마다 점진적으로 출시하고 개선

 

소프트웨어 개발의 Best Practice

1. 소스 통제

- 작업 코드를 보호하기 위해 모든 코드를 단일 위치에 보관.

2. 지속적 통합

- 자산에 속한 각 구성요소가 수명주기 동안 일관성 있게 호환되어야 함

-> 모든 팀원이 유사한 프로그래밍 언어 및 라이브러리를 사용하여 충돌과 중복을 방지

3. SDLC 관리 시스템으로 프로세스 투명성 확보

- SDLC 관리 시스템은 분석, 작업 관리 시스템, 버그 추적으로 각 단계를 제어하고, 효과적으로 실행되지 않는 수명주기 영역을 개선할 수 있음.

 

 

 

 

 

 

 

블로그 이미지

uchacha

개발자 일지

,

- @참고: https://vmpo.tistory.com/106

 

양수에서 가장 큰 수가, 음수에서 가장 작은 수다!!!

11111111111111111111111111111111 = -1
11111111111111111111111111111110 = -2
11111111111111111111111111111101 = -3
11111111111111111111111111111100 = -4
11111111111111111111111111111011 = -5
11111111111111111111111111111010 = -6
11111111111111111111111111111001 = -7
11111111111111111111111111111000 = -8

 

//음수는 not 연산에 1을 더한 값이다.
-1*n == ~n + 1
블로그 이미지

uchacha

개발자 일지

,

환경

docker, spring boot, mysql 로 구동되는 application 에서 

어제만 해도 잘 동작하던 application 이 코드 수정 후 업데이트를 하자 아래와 같은 에러를 냈다.

- 에러 내역

더보기
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
	at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
	at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836)
	at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456)
	at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
	at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198)
	at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
	at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358)
	at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206)
	at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477)
	at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560)
	at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)
	at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
	at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
	at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:38)
	at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:108)
	... 50 common frames omitted
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
	at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167)
	at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89)
	at com.mysql.cj.NativeSession.connect(NativeSession.java:144)
	at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:956)
	at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826)
	... 63 common frames omitted
Caused by: java.net.NoRouteToHostException: Host is unreachable
	at java.base/sun.nio.ch.Net.pollConnect(Native Method)
	at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:579)
	at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:549)
	at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597)
	at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:339)
	at java.base/java.net.Socket.connect(Socket.java:585)
	at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155)
	at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63)
	... 66 common frames omitted

찾아보니 네트워크 router 관련 문제라고 하였다.

 

확인

해당 서버에서 db 서버로 접속이 잘 되는지 command 접속하여 확인해봤더니 접속이 잘 되었다.

application 을 docker 없이 따로 구동시켰더니 잘 되었다.

따라서 docker 문제임을 알 수 있었는데, 따로 변경해주었던 사항은 없었어서

 

해결

image 를 삭제했다가 새로 말아서 하니 network를 잘 잡았는지 잘 되었다.

 

* 기타로 효과를 못봤던 작업은

docker 껐다 켜기 효과 없음

컴퓨터를 껐다 켜기 효과 없음

블로그 이미지

uchacha

개발자 일지

,

- @참고: https://blog.naver.com/alice_k106/221310477844

[root@docker-node01 ~] docker ps -a --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}'
 
NAMES               IMAGE               STATUS
C0                  ubuntu:14.04        Exited (0) 22 hours ago
cs

 

  1. exit code 0: 성공적으로 종료됨
  2. exit code 125: 도커 명령어 자체가 실패한 경우
  3. exit code 126: 컨테이너의 커맨드가 실패한 경우 
  4. exit code 127: 컨테이너의 커맨드가 존재하지 않는 경우
  5. exit code 128 + n: 리눅스 시그널 n에 해당하는 오류가 발생한 경우 
    1. exit code 130: (128+2) Control + C로 종료된 경우
    2. exit code 137 & 143: (128+9, 15) 컨테이너가 SIGKILL 및 SIGTERM 을 받은 경우
      • 참고로, 컨테이너의 메모리 자원 부족으로 인한 OOM 시 컨테이너의 강제 종료에도 SIGKILL이 사용되어 137로 출력된다.
    3. exit code 255: 종료 코드가 범위를 벗어나는 경우 
블로그 이미지

uchacha

개발자 일지

,

[Java] System.in.read()

Algorithm 2022. 11. 1. 01:55

- @참고: https://blog.naver.com/jihogrammer/222314445259

 

아래와 같은 형태로 입력되는 입력값을 빠르게 받기는 법

2
10 8 17
0 0
1 0
1 1
4 2
4 3
4 5
2 4
3 4
7 4
8 4
9 4
7 5
8 5
9 5
7 6
8 6
9 6
10 10 1
5 5

 

- 코드

private static int read() throws Exception {

    int c, n = System.in.read() & 15;

    while ((c = System.in.read()) > 32)
        n = (n << 3) + (n << 1) + (c & 15);

    if (c == 13) System.in.read();

    return n;

}
[출처] [Java] System.in.read() - 3|작성자 jihogrammer

 

코드 주석

# n = System.in.read() & 15;

15 = 1111(2) 이고

n = System.in.read() 일 때, 한글자의 수를 읽으면 48 <= n <= 57

48 = 32 + 16 = 2^5 + 2^4 이므로 4, 5번째 자리를 제외한 하위비트만 읽어오면 48를 빼는것과 같아진다.

뺄셈을 연산하지 않고도 단순 비트 연산을 통해 읽을 수 있다.

Char	ASCII	Binary
'0' ==	48	== 11_0000
'1' == 	49  == 11_0001
'2' ==	50  == 11_0010
...
'9'	== 	57	== 11_1001

n & 15 연산을 수행하여 뒤 4자리 비트만 읽을 수 있다.

 

# n = (n << 3) + (n << 1) + (c & 15);

위 식은에서 (c & 15) 앞쪽은  n = n * 8 + n * 2 

= n * 10 이다.

왜 이렇게 표현했는가 하면,

* 연산은 생각보다 ALU에서 처리하는 양이 많다. (내부적으로 shift 연산과 add 연산을 반복적으로 수행하기 때문에)

최적화 되어있는 방식으로 표현하여 수행속도를 빨리하기 위함이다.

블로그 이미지

uchacha

개발자 일지

,

- @참고: https://greatkim91.tistory.com/197

 

위 글에서

 

1. Java9 의 장점

2. Java9 의 탄생 목적(기존의 문제점)

3. Java9 에서 가능해진 일

4. Java9에서 고려해야 할 점(넘어야할 산)

 

등에 대해서 잘 설명해두었다.

 

기존 Java 의 캡슐화 지원이 부족해서 Java9 가 생겼다고 하는데, 이는 

기존에 JAR 로 제공된 패키지에서 사용하는 class 만 노출하기가 안된다는 점이다. 왜냐하면 기존에는 대부분의 클래스가 public 이기 때문이다.

문제는 API 제공자가 기능 향상이나 리팩토링을 하기 위해 이러한 내부용 API 를 바꾸고 싶을 때 문제가 된다.

 

Java Jigsaw 프로젝트는 유연한 런타임 이미지를 만들 수 있도록 Java 플랫폼을 모듈화한다. 이말은 Java 진형의 개발자가 jdk 자체도 자유롭게 업그레이드 할 수 있게 된다는 말이다.

작은 모듈 단위로 관리됨으로, 언어 레벨에서 모듈간의 의존성을 알 수 있으며, 애플리케이션이 사용하는 모듈만 모아 런타임환경(이미지)를 만들 수 있다.

언어레벨에서 모듈화를 지원하기 때문에 도구레벨에서 가능한 일로

java runtime 을 쪼갤 수 있다. 즉 배포시 사용하지 않는 Swing, XML, SQL 같은 패키지를 제외하고 배포할 수 있다.

 

- 런타임 이미지가 작아지는 것의 이점으로

1. 소형 디바이스에서 사용가능

2. 경량으로 도커 이미지, 클라우드 컴퓨팅, 마이크로 서비스에서 활용가능

3. 모듈화 시스템은 스타트업 시 필요한 모듈만 로드할 수 있어서 시간, 성능 향상

4. JDK, JRE 통합 가능

 

단 주의점으로 cyclic dependency(모듈간 상호 참조) 를 주의해야한다.

 

블로그 이미지

uchacha

개발자 일지

,