• Log InLog In
  • Register
Liquid`
Team Liquid Liquipedia
EDT 05:10
CEST 11:10
KST 18:10
  • Home
  • Forum
  • Calendar
  • Streams
  • Liquipedia
  • Features
  • Store
  • EPT
  • TL+
  • StarCraft 2
  • Brood War
  • Smash
  • Heroes
  • Counter-Strike
  • Overwatch
  • Liquibet
  • Fantasy StarCraft
  • TLPD
  • StarCraft 2
  • Brood War
  • Blogs
Forum Sidebar
Events/Features
News
Featured News
Team TLMC #5 - Finalists & Open Tournaments1[ASL20] Ro16 Preview Pt2: Turbulence10Classic Games #3: Rogue vs Serral at BlizzCon9[ASL20] Ro16 Preview Pt1: Ascent10Maestros of the Game: Week 1/Play-in Preview12
Community News
StarCraft II 5.0.15 PTR Patch Notes141BSL 2025 Warsaw LAN + Legends Showmatch2Weekly Cups (Sept 8-14): herO & MaxPax split cups4WardiTV TL Team Map Contest #5 Tournaments1SC4ALL $6,000 Open LAN in Philadelphia8
StarCraft 2
General
StarCraft II 5.0.15 PTR Patch Notes #1: Maru - Greatest Players of All Time Team TLMC #5 - Finalists & Open Tournaments Team Liquid Map Contest #21 - Presented by Monster Energy Weekly Cups (Sept 1-7): MaxPax rebounds & Clem saga continues
Tourneys
Stellar Fest KSL Week 80 StarCraft Evolution League (SC Evo Biweekly) RSL: Revival, a new crowdfunded tournament series SC2's Safe House 2 - October 18 & 19
Strategy
Custom Maps
External Content
Mutation # 491 Night Drive Mutation # 490 Masters of Midnight Mutation # 489 Bannable Offense Mutation # 488 What Goes Around
Brood War
General
ASL20 General Discussion BW General Discussion Diplomacy, Cosmonarchy Edition Soulkey on ASL S20 ASL TICKET LIVE help! :D
Tourneys
[ASL20] Ro16 Group D BSL 2025 Warsaw LAN + Legends Showmatch [ASL20] Ro16 Group C Small VOD Thread 2.0
Strategy
Simple Questions, Simple Answers Muta micro map competition Fighting Spirit mining rates [G] Mineral Boosting
Other Games
General Games
Stormgate/Frost Giant Megathread Path of Exile Borderlands 3 Nintendo Switch Thread General RTS Discussion Thread
Dota 2
Official 'what is Dota anymore' discussion LiquidDota to reintegrate into TL.net
League of Legends
Heroes of the Storm
Simple Questions, Simple Answers Heroes of the Storm 2.0
Hearthstone
Heroes of StarCraft mini-set
TL Mafia
TL Mafia Community Thread
Community
General
US Politics Mega-thread Things Aren’t Peaceful in Palestine Russo-Ukrainian War Thread The Big Programming Thread UK Politics Mega-thread
Fan Clubs
The Happy Fan Club!
Media & Entertainment
Movie Discussion! [Manga] One Piece Anime Discussion Thread
Sports
2024 - 2026 Football Thread Formula 1 Discussion MLB/Baseball 2023
World Cup 2022
Tech Support
Linksys AE2500 USB WIFI keeps disconnecting Computer Build, Upgrade & Buying Resource Thread High temperatures on bridge(s)
TL Community
BarCraft in Tokyo Japan for ASL Season5 Final The Automated Ban List
Blogs
Too Many LANs? Tournament Ov…
TrAiDoS
i'm really bored guys
Peanutsc
I <=> 9
KrillinFromwales
A very expensive lesson on ma…
Garnet
hello world
radishsoup
Lemme tell you a thing o…
JoinTheRain
Customize Sidebar...

Website Feedback

Closed Threads



Active: 1613 users

A programming lesson I won't forget

Blogs > Barbiero
Post a Reply
Barbiero
Profile Blog Joined September 2010
Brazil5259 Posts
July 09 2014 05:52 GMT
#1
So, I'm a CS student. My parents own a radio company(they are lit. Motorola resellers) and they have their share of needs in the world of computing, but they never actually asked me to do something until now. That's because only now have I been actually learning how to develop stuff properly.

Queue the request. It's a fairly simple system to create deadlines for certain jobs in the company, and show who is delaying or not. It's kinda cool.

The issues are, of course, the details. The request was simple: "we want to provide a time window in hours for a job, and the program has to give a date as the deadline". Simple right? Except that the deadline has to account for work days and hours.

Since I have little experience with the various programming languages, my language of choice is Java. Reason being that I'm more used to it and because I know it's very easy to find well documented libraries for almost everything in Java. And alas, there is joda-time as a sweeet date/time language. Love it.

However, It obviously does not include the concept of work days/hours. So how the f* do I implement that?


Man, have I learned a lot of lessons today. First I tried to implement a new class called WorkDateTime to simulate LocalDateTime. Too complicated and most of the functions were duplicates. Scratched.

I ended up making a function that converts a LocalDateTime to the next work hour compatible: so something at 12:20 would be converted to 13:30 on the same day, and Friday 19:00 would become Monday 08:00 of the next week. Joda-time is really good at that.

But the issue was with addition. Since I had a number of hours to serve as a base for my deadline, I needed to find a way to add these hours into a base time(the time of assignment for the job) and not count the non-working hours. Do I add and then count backwards? Do I try to predict it? Fuck this isn't trivial at all.

While trying to think of the solution, one came to mind that made me chuckle: add the hours one by one. For each addition, verify if the time "overflowed" past work hours. If so, convert the time to the next work hour and add the overflow. Finish the loop when there are neither hours nor overflow to add anymore.

I chuckled because that's one hell of an inefficient algorithm. It runs on more-than-linear time compared to the size of the deadline. I thought "that's stupid!" and went back to trying to figure out an efficient algorithm.

I spent literally 8 hours doing that(with a break to watch Liquid win and Brazil get destroyed by Germany). I still haven't figured out how would I implement the algorithm to consider the work hours when adding the new hour.

What did I do? I implemented the "inefficient" one. Not because I gave up, but because it wasn't worth to go to the next day thinking about it when the "inefficiency" isn't THAT costly: the calculation is done once per part of job(so about 150 times a day tops) and most of the deadlines are 2 to 5 hours, maybe one or another with a 20 hour deadline. When you translate this to computer processing, it's a ridiculously small value. The time I waste trying to figure out the efficient one will never be worth the smudge of efficiency I would harvest.

So I literally brute forced my way through this one. Lesson learned: just because it may not be the most efficient, if the efficiency is negligible the development cost isn't worth it.


On a side note, the IntelliJ Idea is awesome. Now to figure out how to work with databases... *shrug*
♥ The world needs more hearts! ♥
icystorage
Profile Blog Joined November 2008
Jollibee19350 Posts
July 09 2014 06:03 GMT
#2
5 star for a programming blog.
LiquidDota StaffAre you ready for a Miracle-? We are! The International 2017 Champions!
SilverSkyLark
Profile Blog Joined April 2008
Philippines8437 Posts
July 09 2014 09:09 GMT
#3
What IDE are you using?
"If i lost an arm, I would play w3." -IntoTheWow || "Member of Hyuk Hyuk Hyuk cafe. He's the next Jaedong, baby!"
LightTemplar
Profile Blog Joined August 2011
Ireland481 Posts
July 09 2014 09:12 GMT
#4
To quote Knuth:
"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil"

Before you ever try to come up with a better algorithm to solve the problem you are facing its a really good idea to do some back of the envelope calculations and figure out how much your inefficiency is actually going to cost in real world terms. Its probably a little late to point that out now but hey you learned the lesson. Best of luck continuing with your development!
"Thoughts are always there, the mind can't stop" - Grubby
Noyect
Profile Blog Joined July 2010
Sweden129 Posts
July 09 2014 12:26 GMT
#5
Cool to see a programming blog
Been practicing on and off myself aswell and the algorithms really are the challenging part :D
This question is more intended as quick brainstorming from a student looking to learn rather
than advice from someone knowledgeable :D

Instead of adding the hours one by one and checking to see if they overflow to the next day, could you
not "re-label" the hours so that hours 1-9 are monday, 10-18 are tuesday and so on?
If a job takes 22 hours you'ld know that it falls into the scope of wednesday.
Stegosaurus
Profile Joined March 2011
United States52 Posts
Last Edited: 2014-07-09 14:59:12
July 09 2014 14:58 GMT
#6
On July 09 2014 18:09 SilverSkyLark wrote:
What IDE are you using?



Since he mentions IntelliJ IDEA, I would guess that.

Good on you for jumping on IDEA, it's an incredible IDE.
If you're writing in Java, and trying to use databases, you should definitely consider using Hibernate. It's pretty awesome.
*insert witty comment here*
Barbiero
Profile Blog Joined September 2010
Brazil5259 Posts
July 09 2014 15:42 GMT
#7
On July 09 2014 21:26 Noyect wrote:
Cool to see a programming blog
Been practicing on and off myself aswell and the algorithms really are the challenging part :D
This question is more intended as quick brainstorming from a student looking to learn rather
than advice from someone knowledgeable :D

Instead of adding the hours one by one and checking to see if they overflow to the next day, could you
not "re-label" the hours so that hours 1-9 are monday, 10-18 are tuesday and so on?
If a job takes 22 hours you'ld know that it falls into the scope of wednesday.

This falls off when dealing with holidays, company breaks etc. Basically, later I'll need to have a holiday database as well.

Also yeah I'm using intellij idea
♥ The world needs more hearts! ♥
obesechicken13
Profile Blog Joined July 2008
United States10467 Posts
Last Edited: 2014-07-09 23:12:40
July 09 2014 23:11 GMT
#8
On July 09 2014 18:12 LightTemplar wrote:
To quote Knuth:
"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil"

Before you ever try to come up with a better algorithm to solve the problem you are facing its a really good idea to do some back of the envelope calculations and figure out how much your inefficiency is actually going to cost in real world terms. Its probably a little late to point that out now but hey you learned the lesson. Best of luck continuing with your development!

To be honest, it's really hard to know just how efficient your code has to be, because you don't know if you're slowing database queries or writing inefficient code that occasionally results in crashes/spikes to your services.

I think if you don't know how efficient your code needs to be it can be worthwhile to take the time to think of a way to optimize it slightly.

(I just need to really have a massive failure before I agree with Knuth).
I think in our modern age technology has evolved to become more addictive. The things that don't give us pleasure aren't used as much. Work was never meant to be fun, but doing it makes us happier in the long run.
CatNzHat
Profile Blog Joined February 2011
United States1599 Posts
July 10 2014 04:55 GMT
#9
How would you go about figuring out 23 work hours from now, starting at 2pm today, as a human, with pen and paper.

This is how you should start when you develop an algorithm.

I would start with breaking it into 2 separate pieces, how many days from now, and how many hours into that day.

23 hours is 2 days (8 hrs each) and 7 hours (23 - (2*8) = 7)
Simply advance current time by 2 days and 7 hours.
But wait, what if it's 12:00pm right now, that would mean I've already worked 3 hours today, so if I go 7 hours forward I'll end up with 10 hours. Delegate back to the same logic, 10 hours is 1 day and 2 hours. Advance a day, start 2 hours in.


We can see a pattern starting to form here, you have a concept of hours in a work day, and you have a concept of how that maps to hours in a day. The same pattern holds for days of work in a week.

If it's the 5th work day in the week and the last hour in that day, adding two hours will have to advance the day, which will advance the week.

The class could be laid out with a configuration something like this:
hours_in_workday: 8
start_of_week: monday
start_of_weekend: saturday
length_of_weekend: 2 days
start_of_day: 9:00am
start_of_lunch: 12:00pm
lunch_duration: 1:00hr

With this information you can construct a pretty simple time keeping system, and configure it as needed. Insert national holidays, etc.. etc..

While this solution is definitely more efficient than yours, I never once considered performance. All I was thinking of was the simplest solution that was easy to understand. I start with how I would solve the problem by hand with pen and paper. It's rather straight forward and kind of trivial when you really think about it. The only 'logic' is a switch to simply say 'is this number of hours larger than the work day' and 'is this number of days larger than the work week'.

Code clarity and simplicity is what allows you to build and maintain complex code bases.

There is a unique skillset for figuring out how you're really solving a problem, I mean if I told you to figure out what time you'd be done with something next week if you start on a wednesday afternoon at 2pm if it were to take you exactly 34 hours and you worked exactly 40 hours a week.

You'd be able to figure it out, and you wouldn't iterate through each hour to do it. You might even optimize your solution without even realizing it, subtracting the number of hours left in the current week since you know it will be some time next week, and then subtracting from that in 8 hour chunks to determine how many days into the next week it would be, and then subtracting 4 to determine how many hours after your lunch break it will be.

Converting that to code is a separate matter, and can be done many different ways, and that is where the real performance issues can be benchmarked and addressed.
rebdomine
Profile Blog Joined October 2010
6040 Posts
July 11 2014 09:22 GMT
#10
On July 09 2014 23:58 Stegosaurus wrote:
Show nested quote +
On July 09 2014 18:09 SilverSkyLark wrote:
What IDE are you using?



Since he mentions IntelliJ IDEA, I would guess that.

Good on you for jumping on IDEA, it's an incredible IDE.
If you're writing in Java, and trying to use databases, you should definitely consider using Hibernate. It's pretty awesome.


I think it is worthwhile to learn the basics of SQL though before jumping straight into Hibernate. I see a lot of people struggling with native SQL cause they've been too used to Hibernate.
"Just because you are correct doesn't mean you are right!"
Count9
Profile Blog Joined May 2009
China10928 Posts
July 13 2014 01:38 GMT
#11
Thought this was gonna be about the scheduling problem and algorithms from the beginning. Also, pretty sure your solution is linear time :p
SpeaKEaSY
Profile Blog Joined December 2010
United States1070 Posts
July 14 2014 11:49 GMT
#12
haha I'd do this sort of thing on math tests where they had you add large numbers in series, I'd just write a quick program for the TI-83+ to brute force the problem rather than solve it analytically
Aim for perfection, settle for mediocrity - KawaiiRice 2014
ZeaL.
Profile Blog Joined April 2009
United States5955 Posts
Last Edited: 2014-07-18 20:32:27
July 18 2014 20:32 GMT
#13
oops
Please log in or register to reply.
Live Events Refresh
BSL Open LAN 2025 - War…
08:00
Day 1 - Group Stages
LiquipediaDiscussion
[ Submit Event ]
Live Streams
Refresh
StarCraft 2
RotterdaM 237
Nina 199
StarCraft: Brood War
actioN 500
GuemChi 465
PianO 259
Aegong 109
Dewaltoss 106
Free 89
Pusan 84
Sharp 78
JulyZerg 60
firebathero 55
[ Show more ]
Nal_rA 54
BeSt 30
Bale 29
sSak 25
ajuk12(nOOB) 17
Sacsri 14
soO 12
Sexy 6
ZZZero.O 1
Dota 2
XcaliburYe922
Fuzer 50
League of Legends
JimRising 464
Counter-Strike
Stewie2K488
allub0
Heroes of the Storm
Khaldor141
Other Games
summit1g6077
crisheroes129
NeuroSwarm107
ViBE29
SortOf22
Trikslyr16
OptimusSC27
Organizations
Other Games
gamesdonequick707
StarCraft 2
Blizzard YouTube
StarCraft: Brood War
BSLTrovo
sctven
[ Show 15 non-featured ]
StarCraft 2
• Berry_CruncH332
• LUISG 37
• Adnapsc2 11
• AfreecaTV YouTube
• intothetv
• Kozan
• IndyKCrew
• LaughNgamezSOOP
• Migwel
• sooper7s
StarCraft: Brood War
• BSLYoutube
• STPLYoutube
• ZZZeroYoutube
League of Legends
• Jankos1062
• Stunt650
Upcoming Events
RSL Revival
51m
Reynor vs Cure
TBD vs Zoun
OSC
11h 51m
BSL Open LAN 2025 - War…
22h 51m
RSL Revival
1d
Classic vs TBD
WardiTV Invitational
1d 1h
Online Event
1d 6h
Wardi Open
2 days
Monday Night Weeklies
2 days
Sparkling Tuna Cup
3 days
LiuLi Cup
4 days
[ Show More ]
The PondCast
5 days
CranKy Ducklings
6 days
Liquipedia Results

Completed

Proleague 2025-09-10
Chzzk MurlocKing SC1 vs SC2 Cup #2
HCC Europe

Ongoing

BSL 20 Team Wars
KCM Race Survival 2025 Season 3
BSL 21 Points
ASL Season 20
CSL 2025 AUTUMN (S18)
LASL Season 20
2025 Chongqing Offline CUP
BSL World Championship of Poland 2025
RSL Revival: Season 2
Maestros of the Game
StarSeries Fall 2025
FISSURE Playground #2
BLAST Open Fall 2025
BLAST Open Fall Qual
Esports World Cup 2025
BLAST Bounty Fall 2025
BLAST Bounty Fall Qual
IEM Cologne 2025
FISSURE Playground #1

Upcoming

IPSL Winter 2025-26
BSL Season 21
SC4ALL: Brood War
BSL 21 Team A
Stellar Fest
SC4ALL: StarCraft II
EC S1
ESL Impact League Season 8
SL Budapest Major 2025
BLAST Rivals Fall 2025
IEM Chengdu 2025
PGL Masters Bucharest 2025
Thunderpick World Champ.
CS Asia Championships 2025
ESL Pro League S22
TLPD

1. ByuN
2. TY
3. Dark
4. Solar
5. Stats
6. Nerchio
7. sOs
8. soO
9. INnoVation
10. Elazer
1. Rain
2. Flash
3. EffOrt
4. Last
5. Bisu
6. Soulkey
7. Mini
8. Sharp
Sidebar Settings...

Advertising | Privacy Policy | Terms Of Use | Contact Us

Original banner artwork: Jim Warren
The contents of this webpage are copyright © 2025 TLnet. All Rights Reserved.