BOJ의 2020년 마무리

안녕하세요.

2020년을 마무리하며 BOJ의 2020년을 정리해봤습니다.

먼저 올해는 BOJ의 10주년이었습니다. 10주년 기념으로 뭔가를 해보려고 했으나, 준비할 시간이 부족해 하지 못했었습니다. 10주년이 아니더라도 이벤트는 언제든 할 수 있으니 시간이 조금 나는대로 준비해보겠습니다.

문제

인터랙티브는 2019년 12월 1일에 생겼지만, 실제로 이 문제가 많이 올라가게 된 것은 올해입니다. 벌써 60-70개 정도의 인터랙티브를 채점할 수 있습니다.

새로운 채점 유형으로 2020년 9월 22일에는 투 스텝도 생겼습니다. 현재 약 10개 정도의 투 스텝 문제를 채점할 수 있고, 그 중 한 문제는 3 스텝입니다.

이렇게 새로운 채점 방식을 추가할 수 있게 되어, 현존하는 거의 모든 문제 스타일을 채점할 수 있게 되었습니다.

올해 엄청나게 많은 양의 출처: Petrozavodsk Programming Camp 문제가 업로드 되었습니다. 매우 높은 난이도가 가득한 문제 세트로 더 어려운 난이도를 원하는 유저들에게 적합한 문제들입니다.

최근 10년 내의 출처: International Olympiad in Informatics 문제를 모두 채점할 수 있게 되었습니다. 내년에는 1994년 이후의 IOI를 모두 채점할 수 있게 하려고 합니다. 꽤 많은 출처: Central European Olympiad in Informatics 의 문제도 채점할 수 있게 되었습니다. 내년에도 모든 CEOI 문제를 채점할 수 있게 하려고 합니다.

2020년 8월 21일에는 문제 목록 옵션이 생겼습니다. 다양한 조건을 이용해 문제 목록을 정렬할 수 있습니다. 이 기능은 2012-3년 경에 계획되었으나 당시 저의 실력 한계로 인해서 구현할 수 없던 기능이었습니다. 한동안 잊고 지내다가 올해 생각이나서 구현할 수 있게 되었습니다. 아직 문제 목록 옵션을 저장할 수는 있지만, 순서를 변경하거나 수정할 수는 없습니다. 이 기능도 빠르면 2020년 중으로 지원하려고 합니다.

문제의 하단에 CC 라이센스가 있는 문제의 라이센스를 추가했고, 문제의 원작자를 추가했습니다. 이 작업은 현재도 계속 하고 있고, 앞으로도 계속 찾을 수 있는 저자 정보를 모두 추가할 때까지 계속 합니다.

데이터 검증

BOJ와 BOJ Stack에 데이터 검증이 추가되었습니다. 데이터 검증은 문제의 데이터가 입력 형식, 문제의 조건을 지키는지 검사할 수 있는 기능입니다. BOJ에서는 저만 구현할 수 있고, BOJ Stack에서는 문제의 출제자가 구현할 수 있습니다. 2020년 12월 24일 기준으로 총 1245개 문제의 데이터 검증 코드가 작성되어 있습니다. 내년 목표는 맞은 사람의 수가 많은 모든 문제에 데이터 검증 코드를 구현하는 것입니다.

재채점

2020년에 총 909개의 재채점을 했습니다. 2018년 1371개 이어 2번째로 많은 재채점을 했습니다. 위에서 언급한 데이터 검증 코드 덕분에 기존 문제의 데이터 형식 오류, 문제 조건의 오류를 찾아낼 수 있었습니다.

2083번 재채점(2020년 3월) 부터는 재채점 기준이 생겨 재채점에 걸리는 시간이 크게 절약되었습니다.

재채점은 BOJ에서 가장 중요한 기능 중 하나입니다. 현재의 재채점 기능은 재채점이 이렇게 많을 것이라고 생각하지 못하고 만든 기능입니다. 2015년 전까지는 재채점이 1년에 100개도 되지 않았었습니다.

2021년에는 재채점과 관련된 정보를 조금 더 쉽게 볼 수 있게 제공하려고 합니다. 또, 현재는 재채점이 진행 중일때 내 재채점 결과를 전체적으로 볼 수 없지만, 2021년에는 이것도 가능하게 해보려고 합니다.

solved.ac

올해 BOJ에서 가장 중요한 사건은 solved.ac의 문제 난이도를 BOJ에서 보여줄 수 있게 되었다는 것입니다. @shiftpsh 님과 이와 관련해서 얘기를 한 것은 2019년 여름이었는데, 약 1년만에 2020년 6월에 이를 BOJ에서 볼 수 있게 되었습니다. 아직 유저의 티어 정보는 BOJ에서 볼 수 없지만, 곧 이것도 볼 수 있게될 예정입니다. 놀라운 서비스를 만들고 운영하는 @shiftpsh 님 감사합니다.

언어

BOJ에서 드디어 .NET을 이용해서 채점할 수 있게 되었습니다. C#, F#, VB.NET의 채점은 2012년부터 가능했지만, 다른 언어에 비해 실행 속도가 너무 느린 문제점이 있었습니다. 지난 2018년에 BOJ에 .NET을 추가하려고 시도했으나, 당시 저의 코딩 실력 부족으로 인해 추가에 실패했었습니다. 그 사이 많은 실력의 향상이 있었는지 2020년 11월 27일 .NET을 채점하는데 성공했습니다.

저는 C# 3.0때 C#을 배웠고, 탑코더를 C#으로 한 적도 있었습니다. 또, 첫 채점 프로그램을 C#을 이용해 작성했을 만큼 C#을 좋아했습니다. BOJ의 초창기에는 C#의 채점을 위해 윈도우 서버를 이용하는 것도 고려했었습니다. 드디어 오랜 소원이었던 .NET의 채점을 지원할 수 있게 되어 정말 기쁩니다.

개인 정보 보호

현존하는 많은 온라인 저지는 아이디 시스템을 이용하고 있고, 이 아이디를 구글 검색 결과에 보여주고 있습니다. BOJ도 그런 온라인 저지를 많이 사용한 사람이 만들었기 때문에, 검색에 아이디가 노출되고 있었습니다.

현대적인 웹사이트는 아이디를 노출하지 않으며, 아이디를 사용하지 않는 사이트도 많습니다. 이에 따라서 2019년 11월에 검색 노출을 정보 수정에서 거부할 수 있는 옵션을 만들었습니다.

앞으로는 현대적인 웹사이트가 되기 위해 아이디 시스템을 버리고 이를 변경할 수 있는 닉네임으로 변환하려고 합니다. 이 작업은 지금까지 해왔던 작업과는 다르게 BOJ의 모든 소스와 DB를 건드려야 하는 작업입니다. 2021년까지 완성될 것이라는 약속은 못 드리겠지만, 늦어도 2023년까지는 이를 지원할 수 있게 하려고 합니다.

대회

스코어보드는 대회에서 매우 중요한 기능입니다. BOJ의 스코어보드는 총 3가지가 있는데, 표, 스팟보드, BOJ 보드가 있습니다. 이 중 표를 제외하고는 BOJ의 대회 기능을 100% 지원하지 않고 있었습니다. 또한, 스코어보드의 정렬 기준에 정리되어 있는 문서 또한 없었습니다.

20184번 문제: BOJ 대회 스코어보드를 만들어 스코어보드의 정렬 기준을 모두 정리해놓았고, BOJ 보드는 이를 모두 지원하게 수정했습니다. 또한, 스코어보드 안내 페이지를 만들어 스코어보드와 관련된 정보를 모두 정리해놓았습니다. 앞으로 스팟 보드도 이를 지원할 수 있게 노력해볼 예정입니다.

대회는 BOJ에서 가장 중요한 기능 중 하나입니다. 2018년부터 대회의 목표는 @baekjoon 의 의존성을 매우 크게 줄이는 것이고, 이는 현재 많이 실현되었습니다. 마지막 남은 의존인 대회 전용 유저 아이디의 생성, 문제 기여자 추가 등도 빨리 지원하려고 합니다.

전에 블로그: 2020년 7월 25일 서버 사고에서 언급한 앞으로의 계획은 현재 구현했으나, 아직 어디까지 보이는 것이 적당한지 몰라 현재 공개를 보류하고 있습니다.

더욱 더 안전한 대회를 만들기 위해서 노력하겠으며, 사고가 발생했더라도 최대한 대회 운영자가 이를 처리할 수 있게 준비하겠습니다.

서버 사고

2020년에서 빠질 수 없는 사건은 블로그: 2020년 7월 25일 서버 사고블로그: 2020년 11월 21일 서버 사고 입니다.

그동안 큰 사고 없이 대회를 진행해왔는데, 이런 일이 2019년에 한 번에 이어서 두 번이나 생겨서 죄송합니다.

2019년 당시 사고를 겪으면서, 이와 관련된 준비를 정말 철저히 했으나, 예상치 못한 부분에서 또 문제가 생겼었습니다. 서버 사고는 웹사이트 운영을 하는 입장에서 가장 피하고 싶은 사고입니다. 서버 사고는 사이트에 대한 신뢰를 크게 무너뜨리며, 자주 발생하면 피하게 되는 사이트가 될 수도 있습니다.

BOJ에서 대회를 여는 선택 기준에 "서버의 안정성"이 생기기 위해서 남은 12월과 내년, 그리고 계속해서 노력하겠습니다.

두 번째 서버 사고의 원인은 DB 서버의 용량 문제는 예상하지 못했었습니다. 다른 용량은 모두 모니터링을 하고 있었는데, 저 부분에서 문제가 생기는 것을 미리 생각하지 못한 제 잘못입니다. 모니터링을 했었더라면, AWS RDS에 Storage Auto Scaling이 2019년 6월에 생긴 것을 알았더라면 이 사고는 일어나지 않았을텐데, 미리 대비하지 못해서 너무 죄송합니다. 이런 사건을 통해서 자꾸 뭔가를 배워가기 보다는 미리 대비하겠습니다.

과거에 채점 서버를 스트레스 테스트하기 위해 "랜덤 게임" 문제들을 만들어 모두 테스트 했었던 것 처럼, 웹도 그런식으로 테스트를 해보고 있습니다.

내년에도 많은 대회가 BOJ에서 열렸으면 좋겠고, 내년에도 그리고 계속해서 서버 사고 없는 BOJ를 만들겠습니다.

기타

채점 결과의 색상을 변경했고, 계정 연동에 많은 분들이 요청 주신 AtCoder도 지원했습니다.

글: 컴파일 에러 업데이트와 같이 컴파일 에러 이유를 C++ 이외의 다른 언어에서도 볼 수 있게 되었고, 18856번 문제: 피드백 문제와 같이 틀린 이유를 보여주는 문제도 생겼습니다.

많은 분들이 이용하시던 유저 정보 페이지에서 문제 제목을 보는 기능과 두 유저를 비교하는 기능이 현재 BOJ에서 빠져있는 상태입니다. 빠른 시일 내에 조금 더 나은 방식으로 지원하려고 합니다.

2020년 마지막 할 일

요청 게시판을 만들고 있습니다. 요청 게시판은 BOJ 게시판의 오타/오역/요청 부분을 따로 뗀 기능입니다. 요청 처리에 특화되어 편하게 이용하고, 이를 반영하는 시간도 매우 절약해보려고 합니다. 현재 너무 비효율적인 시스템으로 운영하고 있어 게시판 요청 처리가 2-3달씩 밀렸습니다. 글: 4달반 밀린 오타/오역/요청 모두 처리과 같이 4달 반이나 밀린 요청을 모두 처리했다고 자랑하는 글도 있을 정도입니다. 앞으로는 자랑할 일이 없게 해보려고 합니다.

12월 31일 전에 오픈해보려고 합니다.

2021년과 그 이후

취미로 운영하던 2015년까지는 시험 공부, 학교 숙제 등을 안하면서 개발했었습니다. 시험 기간은 BOJ 새 기능 추가 기간을 의미했습니다. 제가 이 사이트의 유일한 운영자이자 개발자이고, 2017년부터 일이 점점 많아지더니, 2018년부터는 일이 너무 많아 게시판 관리나 대회 관리, BOJ 개발등에 시간을 많이 쏟지 못했습니다.

밀린 일이 너무 많습니다. 그룹은 다시 개발해서 새롭게 재탄생 시킬 예정이고, 게시판도 다시 개발할 예정입니다. 예전에 있다가 사라진 소스 코드 댓글은 다시 부활시킬 예정이고, 몇년째 계획 중인 버츄얼 컨테스트도 만들어볼 예정입니다. BOJ Stack을 통해 문제 번역, 스페셜 저지 구현도 추가할 예정이고, 문제 목록도 정리할 수 있게 하려고 합니다. Startlink/update-note의 많은 내용을 구현해보려고 합니다.

위에 적힌 내용 외에도 하려고 하는 일이 많습니다.

2021년 한 해 동안은 다른 일을 거의 안하고 BOJ에만 시간을 모두 쏟아보려고 합니다.

2021년은 많은 문제가 추가되고, 많은 유저가 이용하고, 많은 대회가 BOJ에서 열리며, 서버 사고가 없는 한 해가 되었으면 좋겠습니다.

BOJ에 추가되었으면 하는 기능이나 의견은 https://github.com/Startlink/BOJ-Feature-Request/issues 또는 사이트 하단의 이메일, BOJ 슬랙 DM으로 보내주세요.