SlideShare a Scribd company logo
.NET의 현재와 미래. 그 새로운 시작
김태영
기술 에반젤리스트
한국마이크로소프트
DESKTOP WEB CLOUD MOBILE GAMING IoT AI
.NET
.NET – 무엇이든지 만들 수 있는 플랫폼
😅
dot.net/customers
Visual Studio
+1 million new
monthly active
.NET developers in
last year
0
200,000
400,000
600,000
800,000
1,000,000
1,200,000
2018.12 2019.01 2019.02 2019.03 2019.04
1 백만명 이상의 .NET Core 개발자
Visual Studio, Visual Studio for Mac, Visual Studio Code
Big data Machine
Learning
Windows
desktop
C#
C# 8.0
오늘 다루는 주제들
Web &
microservices
.NET vNext
.NET
.NET Core 3.0의 주요 목표
대용량(테라/페타) 데이터셋을 위한 분산 분석 엔진
Distributed analytics engine for large datasets typically terabytes or petabytes
현재 Scala, Java, Python 및 R과 함께 사용 가능
.NET은 지원없음 🙊
도
• 하지만, .NET이 OSS 빅데이터 분야를 지원하지
않았기에, .NET 세상에서 빅데이터는 정적이 흐른다…
• 기존 .NET으로 작성되어 있는 비즈니스 로직들 중
빅데이터에 활용 가능한 로직은 수백만 줄의 코드에
이른다
• 이러한 로직을 Python/Scala/Java 로 변환하는 것은
어려울 뿐만 아니라 비용도 엄청나게 든다!
최근 수행된 .NET 개발자 설문조사(1000 명 이상 참여) 결과,
70% 이상의 개발자들이 Apache Spark에 관심이 있다고 말했다.
😍
💖
preview
dot.net/spark
Spark SQL + DataFrame Streaming & interactive Speed & productivityMachine Learning
Total execution time (seconds) for all 22 queries in the TPC-H benchmark (lower is better).
Data sourced from an internal run of the TPC-H benchmark, using warm execution on Ubuntu 16.04.
.NET for Apache Spark는 고성능을
위해 설계되었고, TPC-H 벤치마크에서
python보다 나은 성능을 보이고 있다.
tpc.org/tpch.
TPC-H 벤치마크는 업무(business) 중심의 쿼리
집합으로 구성되어 있으며, 자세한 내용은
dot.net/spark 를 참고
406 433
375
.NET PYTHON SCALA
TPC-H 벤치마크의 전체 22개의 쿼리 실행에 걸린 총 실행 시간(초)
낮을수록 고성능
val europe = region.filter($"r_name" === "EUROPE")
.join(nation, $"r_regionkey" === nation("n_regionkey"))
.join(supplier, $"n_nationkey" === supplier("s_nationkey"))
.join(partsupp,
supplier("s_suppkey") === partsupp("ps_suppkey"))
val brass = part.filter(part("p_size") === 15
&& part("p_type").endsWith("BRASS"))
.join(europe, europe("ps_partkey") === $"p_partkey")
val minCost = brass.groupBy(brass("ps_partkey"))
.agg(min("ps_supplycost").as("min"))
brass.join(minCost, brass("ps_partkey") === minCost("ps_partkey"))
.filter(brass("ps_supplycost") === minCost("min"))
.select("s_acctbal", "s_name", "n_name",
"p_partkey", "p_mfgr", "s_address",
"s_phone", "s_comment")
.sort($"s_acctbal".desc,
$"n_name", $"s_name", $"p_partkey")
.limit(100)
.show()
var europe = region.Filter(Col("r_name") == "EUROPE")
.Join(nation, Col("r_regionkey") == nation["n_regionkey"])
.Join(supplier, Col("n_nationkey") == supplier["s_nationkey"])
.Join(partsupp,
supplier["s_suppkey"] == partsupp["ps_suppkey"]);
var brass = part.Filter(part["p_size"] == 15
& part["p_type"].EndsWith("BRASS"))
.Join(europe, europe["ps_partkey"] == Col("p_partkey"));
var minCost = brass.GroupBy(brass["ps_partkey"])
.Agg(Min("ps_supplycost").As("min"));
brass.Join(minCost, brass["ps_partkey"] == minCost["ps_partkey"])
.Filter(brass["ps_supplycost"] == minCost["min"])
.Select("s_acctbal", "s_name", "n_name",
"p_partkey", "p_mfgr", "s_address",
"s_phone", "s_comment")
.Sort(Col("s_acctbal").Desc(),
Col("n_name"), Col("s_name"), Col("p_partkey"))
.Limit(100)
.Show();
유사한 구문 – 복붙해도 크게 문제가 없음!
$”col_name” vs. Col(“col_name”) 대,소문자 구분
Scala C#
C# vs Scala (e.g., == vs ===)
.NET for Apache Spark의 주요 목표
.NET 개발자가 Apache Spark를 쉽고 매끄럽게 사용할 수 있도록 돕는 것
전혀 목표가 아닌 부분!
- 기존의 Scala/Python/Java 기반 Spark 개발자가 .NET을 쓰도록 전환 😒
http://ghtorrent.org
AutoML을 활용한
사용자 정의 ML
Model Builder(간단한
UI 도구)와 CLI를 통해
사용자 정의 ML Model을
매우 쉽게 만들 수 있다
.NET 개발자를 위해
구축됨
.NET 에코시스템을
그대로 활용하면서 C# 및
F#을 사용하여 사용자
정의 ML 모델을 생성한다
TensorFlow 등으로
확장 가능
다른 대중적인 ML
프레임워크(TensorFlow,
ONNX, Infer.NET 등)를
활용할 수 있다
검증되고 입증된
솔루션
Microsoft Office,
Windows 및 Azure에
활용되고 있는 동일한
ML 프레임워크를 사용
dot.net/ml
ML.NET 1.0
오픈 소스, 크로스 플랫폼 머신 러닝 프레임워크
Product recommendation
Recommend products based on purchase history
using a matrix factorization algorithm.
Sentiment analysis
Analyze the sentiment of customer reviews
using a binary classification algorithm.
Price prediction
Predict taxi fares based on distance traveled
etc. using a regression algorithm.
Customer segmentation
Identify groups of customers with similar
profiles using a clustering algorithm.
Spam detection
Flag text messages as spam using a binary
classification algorithm.
Image classification
Classify images (e.g. broccoli vs pizza) using
a TensorFlow deep learning algorithm.
Sales forecasting
Forecast future sales for products using a
regression algorithm.
GitHub labeler
Suggest the GitHub label for new issues
using a multi-class classification algorithm.
Fraud detection
Detect fraudulent credit card transactions
using a binary classification algorithm.
dot.net/ml
감성 분석
이진 분류(binary classification) 알고리즘을
사용하여 고객 리뷰의 감정을 분석한다
제품 추천
행렬 분해(matrix factorization) 알고리즘을
사용하여 구매 이력을 기반으로 제품들을 추천한다
가격 예측
회귀(regression) 알고리즘을 사용하여 이동 거리
등을 기반으로 택시 요금을 예측한다
고객 세분화
클러스터링(clustering) 알고리즘을 사용하여
유사한 프로필을 가진 고객 그룹을 식별한다
GitHub 레이블러(labeler)
멀티 클래스 분류(multi-class classification)
알고리즘을 사용하여 새로운 이슈에 대한 GitHub
라벨을 제안한다
사기 탐지
이진 분류(binary classification) 알고리즘을
사용하여 신용카드 부정 거래를 감지한다
스팸 탐지
이진 분류(binary classification) 알고리즘을
사용하여 텍스트 메시지를 스팸으로 표시한다
이미지 분류
TensorFlow 딥러닝 알고리즘을 사용하여
이미지(예: 브로콜리 vs 피자)를 분류한다
매출 예측
회귀(regression) 알고리즘을 사용하여 제품의
향후 매출을 예측한다
ctx.BinaryClassification.Trainers.
var options = new
LbfgsLogisticRegressionBinaryTrainer.Options()
{
LabelColumnName = "Label",
FeatureColumnName = "Features",
MaximumNumberOfIterations = 100,
OptimizationTolerance = 1e-8f,
L2Regularization = 0.01f
};
Automated Machine Learning (AutoML)
preview
dot.net/ml
ML.NET Samples
https://github.com/dotnet/machinelearning-samples
dot.net/get-core3
0
50
100
150
200
250
300
0 1 2 3 4 5 6 7 8 9 101112131415161718192021
Weeks since open sourcing
Community PRs
CoreCLR CoreFX WinForms WPF
0
100
200
300
400
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Weeks since open sourcing
Community issues
CoreCLR CoreFX WPF WinForms
Windows forms
WPF
UWP, Unity (3.0 wave부터 지원 시작)
https://devblogs.microsoft.com/dotnet/are-your-windows-forms-and-wpf-applications-ready-for-net-core-3-0/
static async Task Main(string[] args)
{
IAsyncEnumerable<Customer?> customers
= GetCustomersAsync(args[2..]);
await foreach (Customer? customer in customers)
{
string? name = customer switch
{
null => null,
(null, string ln) => $"Ms/Mr {ln}",
(string fn, string ln) => $"{fn[0]}. {ln}",
};
if (name != null) Console.WriteLine(name);
}
}
• Ranges
static async Task Main(string[] args)
{
IAsyncEnumerable<Customer?> customers
= GetCustomersAsync(args[2..]);
await foreach (Customer? customer in customers)
{
string? name = customer switch
{
null => null,
(null, string ln) => $"Ms/Mr {ln}",
(string fn, string ln) => $"{fn[0]}. {ln}",
};
if (name != null) Console.WriteLine(name);
}
}
static async Task Main(string[] args)
{
IAsyncEnumerable<Customer?> customers
= GetCustomersAsync(args[2..]);
await foreach (Customer? customer in customers)
{
string? name = customer switch
{
null => null,
(null, string ln) => $"Ms/Mr {ln}",
(string fn, string ln) => $"{fn[0]}. {ln}",
};
if (name != null) Console.WriteLine(name);
}
}
static async Task Main(string[] args)
{
IAsyncEnumerable<Customer?> customers
= GetCustomersAsync(args[2..]);
await foreach (Customer? customer in customers)
{
string? name = customer switch
{
null => null,
(null, string ln) => $"Ms/Mr {ln}",
(string fn, string ln) => $"{fn[0]}. {ln}",
};
if (name != null) Console.WriteLine(name);
}
}
static async Task Main(string[] args)
{
IAsyncEnumerable<Customer?> customers
= GetCustomersAsync(args[2..]);
await foreach (Customer? customer in customers)
{
string? name = customer switch
{
null => null,
(null, string ln) => $"Ms/Mr {ln}",
(string fn, string ln) => $"{fn[0]}. {ln}",
};
if (name != null) Console.WriteLine(name);
}
}
static async Task Main(string[] args)
{
IAsyncEnumerable<Customer?> customers
= GetCustomersAsync(args[2..]);
await foreach (Customer? customer in customers)
{
string? name = customer switch
{
null => null,
(null, string ln) => $"Ms/Mr {ln}",
(string fn, string ln) => $"{fn[0]}. {ln}",
};
if (name != null) Console.WriteLine(name);
}
}
static async Task Main(string[] args)
{
IAsyncEnumerable<Customer?> customers
= GetCustomersAsync(args[2..]);
await foreach (Customer? customer in customers)
{
string? name = customer switch
{
null => null,
(null, string ln) => $"Ms/Mr {ln}",
(string fn, string ln) => $"{fn[0]}. {ln}",
};
if (name != null) Console.WriteLine(name);
}
}
gRPC
고성능의 계약(contract) 기반
RPC 서비스 (.NET용 지원)
수많은 언어와 플랫폼에서 작동
Worker service
Windows 서비스 혹은 Linux
daemon처럼 장시간 실행해야 하는
백그라운드 프로세스의 시작점
메시지 큐에서 메시지를 생성 및
소비
Web API’s + identity
Web API에 보안/인증을 접목
C#을 사용한
풀스택 웹 개발
AngularJS, React, Vue 등을
알아야 할 필요가 없음
.NET의 안정성 및 일관성 활용
모든 브라우저에서
동작
클라이언트 및 서버에서
강력한 형식 사용
클라이언트 및 서버에서
C# 코드 공유
Web assembly
(선택적, preview)
Native 성능
플러그인이 필요없음
코드변환 필요없음
dot.net/get-framework
마지막
2014
수 많은
.NET
.NET FRAMEWORK .NET CORE XAMARIN / MONO
2014
수 많은
.NET
.NET FRAMEWORK .NET CORE XAMARIN / MONO
• .NET Framework
• .NET Core
• Mono
• Unity
• .NET Compact Framework
• DNA(DotNetAnywhere)
• Silverlight
참고 : https://mattwarren.org/2018/10/02/A-History-of-.NET-Runtimes/
2014 2016
Many
.NETs
.NET
standard
.NET FRAMEWORK .NET CORE XAMARIN / MONO
.NET
2014 Next2016
Many
.NETs
.NET
standard
.NET
.NET STANDARD
지원하지 않는 것들
Web forms, WCF 서버, Windows Workflow(WF)
• .NET Framework 4.8에서만 지원
• .NET 5에 포팅될 계획은 없음
권장사항
• ASP.NET Web forms → ASP.NET Blazor (마이그레이션 가이드 제공 예정)
• WCF server 및 remoting → gRPC (마이그레이션 가이드 제공 예정)
• Windows workflow (WF) → 오픈소스 core workflow (https://github.com/UiPath/corewf)
.NET 5
INFRASTRUCTURE
.NET STANDARD
DESKTOP WEB CLOUD MOBILE GAMING IoT AI
WPF
Windows forms
UWP
ASP.NET Xamarin UnityAzure ARM32
ARM64
ML.NET
.NET for
Apache Spark
.NET : 단일된 통합 플랫폼
2019년 7월
.NET Core
3.0
RC
2019년 9월
.NET Core
3.0
2019년 11월
.NET Core
3.1
LTS
2020년 11월
.NET 5.0
2021년 11월
.NET 6.0
LTS
2022년 11월
.NET 7.0
2023년 11월
.NET 8.0
LTS
dot.net/ml
preview dot.net/spark
//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작

More Related Content

What's hot

iOS 메모리관리
iOS 메모리관리iOS 메모리관리
iOS 메모리관리
Changwon National University
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀
beom kyun choi
 
진큐 오버뷰
진큐 오버뷰진큐 오버뷰
진큐 오버뷰
Jung-Woo Kim
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
명신 김
 
함수형 프로그래밍? 그래서 어떻게
함수형 프로그래밍? 그래서 어떻게함수형 프로그래밍? 그래서 어떻게
함수형 프로그래밍? 그래서 어떻게
Gyooha Kim
 
Fp basic-kotlin
Fp basic-kotlinFp basic-kotlin
Fp basic-kotlin
Myeongin Woo
 
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
beom kyun choi
 
Python machine learning Ch.4
Python machine learning Ch.4Python machine learning Ch.4
Python machine learning Ch.4
PartPrime
 
[Td 2015]java script에게 형(type)이 생겼어요. typescript(박용준)
[Td 2015]java script에게 형(type)이 생겼어요. typescript(박용준)[Td 2015]java script에게 형(type)이 생겼어요. typescript(박용준)
[Td 2015]java script에게 형(type)이 생겼어요. typescript(박용준)
Sang Don Kim
 
씹고 뜯고 맛보고 즐기는 스트림 API
씹고 뜯고 맛보고 즐기는 스트림 API씹고 뜯고 맛보고 즐기는 스트림 API
씹고 뜯고 맛보고 즐기는 스트림 API
Arawn Park
 
EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overview
yongwoo Jeon
 
Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석
용 최
 
ECMA Script 5 & 6
ECMA Script 5 & 6ECMA Script 5 & 6
ECMA Script 5 & 6
sewoo lee
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
beom kyun choi
 
Bs webgl소모임002
Bs webgl소모임002Bs webgl소모임002
Bs webgl소모임002
Seonki Paik
 
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
PgDay.Seoul
 
Naver api for android
Naver api for androidNaver api for android
Naver api for androidSangon Lee
 
하스켈 모나드
하스켈 모나드하스켈 모나드
하스켈 모나드
Kwang Yul Seo
 
집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02
Kwang Woo NAM
 
Fluent Python - Chapter 8
Fluent Python - Chapter 8Fluent Python - Chapter 8
Fluent Python - Chapter 8
Sunghyun Lee
 

What's hot (20)

iOS 메모리관리
iOS 메모리관리iOS 메모리관리
iOS 메모리관리
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀
 
진큐 오버뷰
진큐 오버뷰진큐 오버뷰
진큐 오버뷰
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
 
함수형 프로그래밍? 그래서 어떻게
함수형 프로그래밍? 그래서 어떻게함수형 프로그래밍? 그래서 어떻게
함수형 프로그래밍? 그래서 어떻게
 
Fp basic-kotlin
Fp basic-kotlinFp basic-kotlin
Fp basic-kotlin
 
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
 
Python machine learning Ch.4
Python machine learning Ch.4Python machine learning Ch.4
Python machine learning Ch.4
 
[Td 2015]java script에게 형(type)이 생겼어요. typescript(박용준)
[Td 2015]java script에게 형(type)이 생겼어요. typescript(박용준)[Td 2015]java script에게 형(type)이 생겼어요. typescript(박용준)
[Td 2015]java script에게 형(type)이 생겼어요. typescript(박용준)
 
씹고 뜯고 맛보고 즐기는 스트림 API
씹고 뜯고 맛보고 즐기는 스트림 API씹고 뜯고 맛보고 즐기는 스트림 API
씹고 뜯고 맛보고 즐기는 스트림 API
 
EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overview
 
Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석
 
ECMA Script 5 & 6
ECMA Script 5 & 6ECMA Script 5 & 6
ECMA Script 5 & 6
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
Bs webgl소모임002
Bs webgl소모임002Bs webgl소모임002
Bs webgl소모임002
 
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
 
Naver api for android
Naver api for androidNaver api for android
Naver api for android
 
하스켈 모나드
하스켈 모나드하스켈 모나드
하스켈 모나드
 
집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02집단지성 프로그래밍 04-검색과 랭킹-02
집단지성 프로그래밍 04-검색과 랭킹-02
 
Fluent Python - Chapter 8
Fluent Python - Chapter 8Fluent Python - Chapter 8
Fluent Python - Chapter 8
 

Similar to //BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작

Mongo db 최범균
Mongo db 최범균Mongo db 최범균
Mongo db 최범균
beom kyun choi
 
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
Jaeseung Ha
 
Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)
Eunbee Song
 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crow
Jaeseung Ha
 
안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트
병한 유
 
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
Sang Don Kim
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
Jongwook Choi
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기OnGameServer
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산
[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산
[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산
S.O.P.T - Shout Our Passion Together
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기
지수 윤
 
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
Elasticsearch
 
Meteor IoT
Meteor IoTMeteor IoT
Meteor IoT
Jaeho Lee
 
3ds maxscript 튜토리얼_20151206_서진택
3ds maxscript 튜토리얼_20151206_서진택3ds maxscript 튜토리얼_20151206_서진택
3ds maxscript 튜토리얼_20151206_서진택
JinTaek Seo
 
XECon + PHPFest 2014 Keynote
XECon + PHPFest 2014 KeynoteXECon + PHPFest 2014 Keynote
XECon + PHPFest 2014 Keynote
Sol Kim
 
Serverless content recommendation
Serverless content recommendationServerless content recommendation
Serverless content recommendation
Sanghyun Lee
 
배워봅시다 머신러닝 with TensorFlow
배워봅시다 머신러닝 with TensorFlow배워봅시다 머신러닝 with TensorFlow
배워봅시다 머신러닝 with TensorFlow
Jang Hoon
 
IPython
IPythonIPython
IPython
Kyunghoon Kim
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2
Chris Ohk
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013Esun Kim
 

Similar to //BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작 (20)

Mongo db 최범균
Mongo db 최범균Mongo db 최범균
Mongo db 최범균
 
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
 
Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)
 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crow
 
안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트
 
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산
[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산
[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기
 
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
 
Meteor IoT
Meteor IoTMeteor IoT
Meteor IoT
 
3ds maxscript 튜토리얼_20151206_서진택
3ds maxscript 튜토리얼_20151206_서진택3ds maxscript 튜토리얼_20151206_서진택
3ds maxscript 튜토리얼_20151206_서진택
 
Scala for play
Scala for playScala for play
Scala for play
 
XECon + PHPFest 2014 Keynote
XECon + PHPFest 2014 KeynoteXECon + PHPFest 2014 Keynote
XECon + PHPFest 2014 Keynote
 
Serverless content recommendation
Serverless content recommendationServerless content recommendation
Serverless content recommendation
 
배워봅시다 머신러닝 with TensorFlow
배워봅시다 머신러닝 with TensorFlow배워봅시다 머신러닝 with TensorFlow
배워봅시다 머신러닝 with TensorFlow
 
IPython
IPythonIPython
IPython
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
 

//BUILD/ Seoul - .NET의 현재와 미래. 그 새로운 시작

  • 1.
  • 2. .NET의 현재와 미래. 그 새로운 시작 김태영 기술 에반젤리스트 한국마이크로소프트
  • 3. DESKTOP WEB CLOUD MOBILE GAMING IoT AI .NET .NET – 무엇이든지 만들 수 있는 플랫폼
  • 5. Visual Studio +1 million new monthly active .NET developers in last year 0 200,000 400,000 600,000 800,000 1,000,000 1,200,000 2018.12 2019.01 2019.02 2019.03 2019.04 1 백만명 이상의 .NET Core 개발자 Visual Studio, Visual Studio for Mac, Visual Studio Code
  • 6. Big data Machine Learning Windows desktop C# C# 8.0 오늘 다루는 주제들 Web & microservices .NET vNext .NET .NET Core 3.0의 주요 목표
  • 7. 대용량(테라/페타) 데이터셋을 위한 분산 분석 엔진 Distributed analytics engine for large datasets typically terabytes or petabytes 현재 Scala, Java, Python 및 R과 함께 사용 가능 .NET은 지원없음 🙊
  • 8. 도 • 하지만, .NET이 OSS 빅데이터 분야를 지원하지 않았기에, .NET 세상에서 빅데이터는 정적이 흐른다… • 기존 .NET으로 작성되어 있는 비즈니스 로직들 중 빅데이터에 활용 가능한 로직은 수백만 줄의 코드에 이른다 • 이러한 로직을 Python/Scala/Java 로 변환하는 것은 어려울 뿐만 아니라 비용도 엄청나게 든다! 최근 수행된 .NET 개발자 설문조사(1000 명 이상 참여) 결과, 70% 이상의 개발자들이 Apache Spark에 관심이 있다고 말했다. 😍 💖
  • 9. preview dot.net/spark Spark SQL + DataFrame Streaming & interactive Speed & productivityMachine Learning
  • 10. Total execution time (seconds) for all 22 queries in the TPC-H benchmark (lower is better). Data sourced from an internal run of the TPC-H benchmark, using warm execution on Ubuntu 16.04. .NET for Apache Spark는 고성능을 위해 설계되었고, TPC-H 벤치마크에서 python보다 나은 성능을 보이고 있다. tpc.org/tpch. TPC-H 벤치마크는 업무(business) 중심의 쿼리 집합으로 구성되어 있으며, 자세한 내용은 dot.net/spark 를 참고 406 433 375 .NET PYTHON SCALA TPC-H 벤치마크의 전체 22개의 쿼리 실행에 걸린 총 실행 시간(초) 낮을수록 고성능
  • 11. val europe = region.filter($"r_name" === "EUROPE") .join(nation, $"r_regionkey" === nation("n_regionkey")) .join(supplier, $"n_nationkey" === supplier("s_nationkey")) .join(partsupp, supplier("s_suppkey") === partsupp("ps_suppkey")) val brass = part.filter(part("p_size") === 15 && part("p_type").endsWith("BRASS")) .join(europe, europe("ps_partkey") === $"p_partkey") val minCost = brass.groupBy(brass("ps_partkey")) .agg(min("ps_supplycost").as("min")) brass.join(minCost, brass("ps_partkey") === minCost("ps_partkey")) .filter(brass("ps_supplycost") === minCost("min")) .select("s_acctbal", "s_name", "n_name", "p_partkey", "p_mfgr", "s_address", "s_phone", "s_comment") .sort($"s_acctbal".desc, $"n_name", $"s_name", $"p_partkey") .limit(100) .show() var europe = region.Filter(Col("r_name") == "EUROPE") .Join(nation, Col("r_regionkey") == nation["n_regionkey"]) .Join(supplier, Col("n_nationkey") == supplier["s_nationkey"]) .Join(partsupp, supplier["s_suppkey"] == partsupp["ps_suppkey"]); var brass = part.Filter(part["p_size"] == 15 & part["p_type"].EndsWith("BRASS")) .Join(europe, europe["ps_partkey"] == Col("p_partkey")); var minCost = brass.GroupBy(brass["ps_partkey"]) .Agg(Min("ps_supplycost").As("min")); brass.Join(minCost, brass["ps_partkey"] == minCost["ps_partkey"]) .Filter(brass["ps_supplycost"] == minCost["min"]) .Select("s_acctbal", "s_name", "n_name", "p_partkey", "p_mfgr", "s_address", "s_phone", "s_comment") .Sort(Col("s_acctbal").Desc(), Col("n_name"), Col("s_name"), Col("p_partkey")) .Limit(100) .Show(); 유사한 구문 – 복붙해도 크게 문제가 없음! $”col_name” vs. Col(“col_name”) 대,소문자 구분 Scala C# C# vs Scala (e.g., == vs ===)
  • 12. .NET for Apache Spark의 주요 목표 .NET 개발자가 Apache Spark를 쉽고 매끄럽게 사용할 수 있도록 돕는 것 전혀 목표가 아닌 부분! - 기존의 Scala/Python/Java 기반 Spark 개발자가 .NET을 쓰도록 전환 😒
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20. AutoML을 활용한 사용자 정의 ML Model Builder(간단한 UI 도구)와 CLI를 통해 사용자 정의 ML Model을 매우 쉽게 만들 수 있다 .NET 개발자를 위해 구축됨 .NET 에코시스템을 그대로 활용하면서 C# 및 F#을 사용하여 사용자 정의 ML 모델을 생성한다 TensorFlow 등으로 확장 가능 다른 대중적인 ML 프레임워크(TensorFlow, ONNX, Infer.NET 등)를 활용할 수 있다 검증되고 입증된 솔루션 Microsoft Office, Windows 및 Azure에 활용되고 있는 동일한 ML 프레임워크를 사용 dot.net/ml ML.NET 1.0 오픈 소스, 크로스 플랫폼 머신 러닝 프레임워크
  • 21. Product recommendation Recommend products based on purchase history using a matrix factorization algorithm. Sentiment analysis Analyze the sentiment of customer reviews using a binary classification algorithm. Price prediction Predict taxi fares based on distance traveled etc. using a regression algorithm. Customer segmentation Identify groups of customers with similar profiles using a clustering algorithm. Spam detection Flag text messages as spam using a binary classification algorithm. Image classification Classify images (e.g. broccoli vs pizza) using a TensorFlow deep learning algorithm. Sales forecasting Forecast future sales for products using a regression algorithm. GitHub labeler Suggest the GitHub label for new issues using a multi-class classification algorithm. Fraud detection Detect fraudulent credit card transactions using a binary classification algorithm. dot.net/ml 감성 분석 이진 분류(binary classification) 알고리즘을 사용하여 고객 리뷰의 감정을 분석한다 제품 추천 행렬 분해(matrix factorization) 알고리즘을 사용하여 구매 이력을 기반으로 제품들을 추천한다 가격 예측 회귀(regression) 알고리즘을 사용하여 이동 거리 등을 기반으로 택시 요금을 예측한다 고객 세분화 클러스터링(clustering) 알고리즘을 사용하여 유사한 프로필을 가진 고객 그룹을 식별한다 GitHub 레이블러(labeler) 멀티 클래스 분류(multi-class classification) 알고리즘을 사용하여 새로운 이슈에 대한 GitHub 라벨을 제안한다 사기 탐지 이진 분류(binary classification) 알고리즘을 사용하여 신용카드 부정 거래를 감지한다 스팸 탐지 이진 분류(binary classification) 알고리즘을 사용하여 텍스트 메시지를 스팸으로 표시한다 이미지 분류 TensorFlow 딥러닝 알고리즘을 사용하여 이미지(예: 브로콜리 vs 피자)를 분류한다 매출 예측 회귀(regression) 알고리즘을 사용하여 제품의 향후 매출을 예측한다
  • 23. var options = new LbfgsLogisticRegressionBinaryTrainer.Options() { LabelColumnName = "Label", FeatureColumnName = "Features", MaximumNumberOfIterations = 100, OptimizationTolerance = 1e-8f, L2Regularization = 0.01f };
  • 27.
  • 29. 0 50 100 150 200 250 300 0 1 2 3 4 5 6 7 8 9 101112131415161718192021 Weeks since open sourcing Community PRs CoreCLR CoreFX WinForms WPF 0 100 200 300 400 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Weeks since open sourcing Community issues CoreCLR CoreFX WPF WinForms
  • 30. Windows forms WPF UWP, Unity (3.0 wave부터 지원 시작)
  • 31.
  • 32.
  • 34. static async Task Main(string[] args) { IAsyncEnumerable<Customer?> customers = GetCustomersAsync(args[2..]); await foreach (Customer? customer in customers) { string? name = customer switch { null => null, (null, string ln) => $"Ms/Mr {ln}", (string fn, string ln) => $"{fn[0]}. {ln}", }; if (name != null) Console.WriteLine(name); } }
  • 35. • Ranges static async Task Main(string[] args) { IAsyncEnumerable<Customer?> customers = GetCustomersAsync(args[2..]); await foreach (Customer? customer in customers) { string? name = customer switch { null => null, (null, string ln) => $"Ms/Mr {ln}", (string fn, string ln) => $"{fn[0]}. {ln}", }; if (name != null) Console.WriteLine(name); } }
  • 36. static async Task Main(string[] args) { IAsyncEnumerable<Customer?> customers = GetCustomersAsync(args[2..]); await foreach (Customer? customer in customers) { string? name = customer switch { null => null, (null, string ln) => $"Ms/Mr {ln}", (string fn, string ln) => $"{fn[0]}. {ln}", }; if (name != null) Console.WriteLine(name); } }
  • 37. static async Task Main(string[] args) { IAsyncEnumerable<Customer?> customers = GetCustomersAsync(args[2..]); await foreach (Customer? customer in customers) { string? name = customer switch { null => null, (null, string ln) => $"Ms/Mr {ln}", (string fn, string ln) => $"{fn[0]}. {ln}", }; if (name != null) Console.WriteLine(name); } }
  • 38. static async Task Main(string[] args) { IAsyncEnumerable<Customer?> customers = GetCustomersAsync(args[2..]); await foreach (Customer? customer in customers) { string? name = customer switch { null => null, (null, string ln) => $"Ms/Mr {ln}", (string fn, string ln) => $"{fn[0]}. {ln}", }; if (name != null) Console.WriteLine(name); } }
  • 39. static async Task Main(string[] args) { IAsyncEnumerable<Customer?> customers = GetCustomersAsync(args[2..]); await foreach (Customer? customer in customers) { string? name = customer switch { null => null, (null, string ln) => $"Ms/Mr {ln}", (string fn, string ln) => $"{fn[0]}. {ln}", }; if (name != null) Console.WriteLine(name); } }
  • 40. static async Task Main(string[] args) { IAsyncEnumerable<Customer?> customers = GetCustomersAsync(args[2..]); await foreach (Customer? customer in customers) { string? name = customer switch { null => null, (null, string ln) => $"Ms/Mr {ln}", (string fn, string ln) => $"{fn[0]}. {ln}", }; if (name != null) Console.WriteLine(name); } }
  • 41.
  • 42. gRPC 고성능의 계약(contract) 기반 RPC 서비스 (.NET용 지원) 수많은 언어와 플랫폼에서 작동 Worker service Windows 서비스 혹은 Linux daemon처럼 장시간 실행해야 하는 백그라운드 프로세스의 시작점 메시지 큐에서 메시지를 생성 및 소비 Web API’s + identity Web API에 보안/인증을 접목
  • 43. C#을 사용한 풀스택 웹 개발 AngularJS, React, Vue 등을 알아야 할 필요가 없음 .NET의 안정성 및 일관성 활용 모든 브라우저에서 동작 클라이언트 및 서버에서 강력한 형식 사용 클라이언트 및 서버에서 C# 코드 공유 Web assembly (선택적, preview) Native 성능 플러그인이 필요없음 코드변환 필요없음
  • 46.
  • 47. 2014 수 많은 .NET .NET FRAMEWORK .NET CORE XAMARIN / MONO
  • 48. 2014 수 많은 .NET .NET FRAMEWORK .NET CORE XAMARIN / MONO • .NET Framework • .NET Core • Mono • Unity • .NET Compact Framework • DNA(DotNetAnywhere) • Silverlight 참고 : https://mattwarren.org/2018/10/02/A-History-of-.NET-Runtimes/
  • 51.
  • 52. 지원하지 않는 것들 Web forms, WCF 서버, Windows Workflow(WF) • .NET Framework 4.8에서만 지원 • .NET 5에 포팅될 계획은 없음 권장사항 • ASP.NET Web forms → ASP.NET Blazor (마이그레이션 가이드 제공 예정) • WCF server 및 remoting → gRPC (마이그레이션 가이드 제공 예정) • Windows workflow (WF) → 오픈소스 core workflow (https://github.com/UiPath/corewf)
  • 53. .NET 5 INFRASTRUCTURE .NET STANDARD DESKTOP WEB CLOUD MOBILE GAMING IoT AI WPF Windows forms UWP ASP.NET Xamarin UnityAzure ARM32 ARM64 ML.NET .NET for Apache Spark .NET : 단일된 통합 플랫폼
  • 54. 2019년 7월 .NET Core 3.0 RC 2019년 9월 .NET Core 3.0 2019년 11월 .NET Core 3.1 LTS 2020년 11월 .NET 5.0 2021년 11월 .NET 6.0 LTS 2022년 11월 .NET 7.0 2023년 11월 .NET 8.0 LTS
  • 55.